11、【桥接模式】让将抽象和实现分离,使得它们可以独立地变化

你好,我是程序员雪球。

今天我们来聊聊 23 种设计模式中,一种常见的结构型模式,桥接模式。聊聊它的设计思想、应用场景,以及如何使用。

 c60ea17d6a8a491db0313f29005986f9.png

 

一、设计思想

 

桥接模式(Bridge Pattern)是一种结构型设计模式,用于将抽象部分与实现部分分离,使它们可以独立地变化。这种模式涉及到两个独立的类层次结构:抽象类层次结构和实现类层次结构。抽象类层次结构定义了抽象接口和抽象类,而实现类层次结构则提供了具体的实现。

 

在桥接模式中,抽象类层次结构中的抽象类通过引用或组合的方式与实现类层次结构中的实现类进行关联。这种关联允许抽象类在不改变自身的情况下,通过切换不同的实现类来适应不同的需求。这使得抽象类和实现类可以独立地进行扩展和修改,提高了代码的灵活性和可维护性。

 

二、应用场景

 

桥接模式的应用场景包括以下几个方面:

 

1. 平台无关性:当需要创建一个能够在多个平台上运行的软件系统时,可以使用桥接模式将平台相关的实现与平台无关的抽象部分分离。这样,系统可以根据不同的平台选择相应的实现类,从而实现平台无关性。

2. 多态性:桥接模式允许在运行时动态选择不同的实现类,从而实现多态性。这使得系统可以根据不同的需求选择不同的实现方式,提高了代码的灵活性和扩展性。

3. 可扩展性:桥接模式允许在不修改抽象类的情况下添加新的实现类。这使得系统可以轻松地扩展新的功能,而不会影响现有的代码。

4. 可复用性:桥接模式将抽象部分和实现部分分离,使得抽象类可以在不同的系统中复用,而实现类可以根据具体需求进行定制。这提高了代码的可复用性和可维护性。

 

三、如何使用

 

下面是一个使用 Java 实现桥接模式的示例代码:

 

 

public class BridgePatternExample {

    public static void main(String[] args) {

        // 创建抽象类

        AbstractShape abstractShape = new Circle();

        // 创建实现类

        AbstractImplementation abstractImplementation = new RedImplementation();

        // 将抽象类和实现类关联起来

        abstractShape.setImplementation(abstractImplementation);

        // 调用抽象类的方法,实际执行的是实现类的方法

        abstractShape.draw();

    }

}

 

// 抽象类

abstract class AbstractShape {

    protected AbstractImplementation implementation;

 

    public AbstractShape(AbstractImplementation implementation) {

        this.implementation = implementation;

    }

 

    public void setImplementation(AbstractImplementation implementation) {

        this.implementation = implementation;

    }

 

    public abstract void draw();

}

 

// 具体实现类

class Circle extends AbstractShape {

    public Circle(AbstractImplementation implementation) {

        super(implementation);

    }

 

    @Override

    public void draw() {

        System.out.println("Circle: drawing with color " + implementation.getColor());

    }

}

 

// 具体实现类

class RedImplementation extends AbstractImplementation {

    @Override

    public String getColor() {

        return "red";

    }

}

 

// 具体实现类

class BlueImplementation extends AbstractImplementation {

    @Override

    public String getColor() {

        return "blue";

    }

}

 

// 抽象接口

interface AbstractImplementation {

    String getColor();

}

 

 

在这个示例中,我们定义了一个抽象类  AbstractShape ,它有一个抽象方法  draw() 。我们还定义了一个抽象接口  AbstractImplementation ,它有一个抽象方法  getColor() 。具体的实现类  Circle  和  RedImplementation  分别实现了  AbstractShape  和  AbstractImplementation  接口。

 

在  main()  方法中,我们创建了一个  Circle  对象,并将其与  RedImplementation  对象关联起来。然后,我们调用  draw()  方法,实际执行的是  RedImplementation  对象的  getColor()  方法,从而实现了桥接模式的效果。

 

通过桥接模式,我们将抽象部分和实现部分分离,使得它们可以独立地变化。这样,我们可以根据不同的需求选择不同的实现类,而不会影响抽象类的代码。同时,抽象类也可以在不同的系统中复用,提高了代码的可复用性和可维护性。

 

总结:

 

以上已经为你讲解了桥接模式的设计思想、应用场景,以及如何使用,接下来我带你一起总结。

 

一、设计思想

 

将抽象部分与实现部分分离,使它们可以独立地变化。

 

二、应用场景

 

1. 多态性;

2. 可扩展性;

3. 可复用性;

 

三、如何使用

 

在桥接模式中,抽象类层次结构中的抽象类通过引用或组合的方式与实现类层次结构中的实现类进行关联。这种关联允许抽象类在不改变自身的情况下,通过切换不同的实现类来适应不同的需求。

 

讨论环节:

 

为了方便你理解和巩固今天的内容,我给你留下两个讨论题,请在评论区与我一起讨论吧。

 

1. 桥接模式的核心设计思想是什么?

2. 请说说你用过桥接模式的场景?

 

如果觉得有收获,请双击支持,后期我会持续更新更多相关知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/570656.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ 之二叉搜索树

目录 学习目标: 1.二叉搜索树 1.1二叉搜索树的概念 1.2二叉搜索树的操作 1.二叉搜索树的查找 2.二叉树的插入 3.二叉树的删除* 2.二叉搜索树的实现 3.二叉树性能分析 1.二叉搜索树 1.1二叉搜索树的概念 二叉搜索树又称二叉排序树,它或者是一棵…

spring的bean创建流程源码解析

文章目录 IOC 和 DIBeanFactoryApplicationContext实现的接口1、BeanFactory接口2、MessageSource 国际化接口3、ResourcePatternResolver,资源解析接口4、EnvironmentCapable接口,用于获取环境变量,配置信息5、ApplicationEventPublisher 事…

Java文件流练习

1 扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件 import java.io.File; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanne…

Windows 10 安装配置WSL2(Ubuntu 20.04)教程

Windows 10 安装配置WSL2(Ubuntu 20.04)教程 一、WSL简介 WSL(Windows Subsystem for Linux)是一个兼容层,允许在Windows 10上原生运行Linux二进制可执行文件。 二、安装WSL2 3.1 传统手动安装 更新系统&#xff…

技术速递|Java on Azure Tooling 3月更新 - Java on Azure 开发工具未来六个月路线图发布

作者:Jialuo Gan - Program Manager, Developer Division At Microsoft 排版:Alan Wang 大家好,欢迎阅读 Java on Azure 工具的三月更新。在本次更新中,我们将分享未来几个月对 Java on Azure 开发工具的投资。此外,我…

无限多交换机串联,可以将网线无限延长吗?

网线使用时为了网络质量一般不超过100m,那我每隔100m接一个交换机是不是就可以无限延长了? 完全没有问题。 但是慎用无限、永远、永恒这些字眼,“爱你到永远”这句山盟海誓,看看现在的离婚率就知道有多么不靠谱。 但是&#xff…

MySQL数据库精讲001——概述

MySQL数据库精讲001——概述 文章目录 MySQL数据库精讲001——概述1.1 安装1.1.1 版本1.1.2 安装一、下载二、解压三、配置1. 添加环境变量2. 初始化MySQL3. 注册MySQL服务4. 启动MySQL服务5. 修改默认账户密码 四、登录MySQL五、卸载MySQL 1.1.3 连接1.1.4 企业使用方式(了解)…

共享单车(二):项目日志

stdin, stdout, stderr Linux系统下,当一个用户进程被创建时,与之对应的三个数据流(stdin,stdout和stderr,即三个文件)也会被创建。 stdin,标准输入文件,通常对应着终端的键盘。 s…

SpringBoot内容协商机制(就是接受数据的类型如json,xml)

目录 一、基于请求头的内容协商机制 二、基于请求参数的内容协商机制 一、基于请求头的内容协商机制 如果我们的Java服务为浏览器和安卓手机同时提供服务,浏览器期望接受的请求是JSON格式,安卓客户端期望接收的请求是XML格式,这个时候是否需…

Linux Shell字符串截取#与%使用

背景Jenkins需要解析gerrit的commit message中特殊字段的值,比如Depend-On:字段的值 比如commit msg内容如下:用变量msg表示 1. # 号截取, 截取指定字符保留右边的字符串,删除左边的部分。分为#和##两种 1.1 # 号截取&#xff0c…

Linux文件系统/企业文件系统选型/企业常规服务应用建议/软件及软件安装包管理,rpm,yum系列知识--12272字详谈

这里先补充一下上一节的命令: tune2fs 调整或查看ext2/ext3/ext4文件系统的参数(关闭ext4日志功能) 现在已经被淘汰但是企业笔试或者认证考试会存在 dumpe2fs 用于导出ext2,ext4,ext3文件系统信息(文件系统…

自己写的爬虫小案例

网址:aHR0cDovL2pzc2NqZ3B0Lmp4d3JkLmdvdi5jbi8/dXJsPS92aWV3L3dvcmtpbmdVbml0L3dvcmtpbmdVbml0Lmh0bWw 这串代码能够爬取勘察单位企业的详细信息。 import requests import time import csv f open(勘察单位公司信息.csv,w,encodingutf-8,newline) csv_writer …

时序分析基础(6)——input delay时序分析

1 简介 FPGA对于外部的时钟以及数据的延时信息是不知道的,在低速时钟且时钟发射沿在数据正中心的时候,一般可以不做约束来直接使用。但是到了高速时钟或者双沿采样或者发射沿和数据对齐的情况下,这时候就需要告诉VIVADO外部的时钟与数据情况来…

[Meachines][Medium]IClean

Main $ nmap -p- -sC -sV 10.10.11.12 -Pn --min-rate 1000 $ echo "10.10.11.12 capiclean.htb">>/etc/hosts 这题可能和python的SSTI有关 $ gobuster dir --url "http://capiclean.htb" --wordlist /usr/share/seclists/Discovery/Web-Content/c…

授权协议OAuth 2.0之通过OIDC实现SSO

写在前面 本文来一起看下OIDC(openid connect)相关内容。 1:什么是OIDC OIDC的全称是openid connect,和OAuth2.0一样,也是属于协议和规范的范畴。OAuth2.0是一种授权协议,即规定了what you can do的内容…

2024 证券从业资格证考试备考资料分享

2024 证券从业资格证考试备考资料分享 2024 年 06月1、2日 证券从业资格考试全国统一考试(统考),预计将于5月初(考前一个月)左右开启报名 有没有小伙伴在准备备考的,不知道大家都准备怎么学习呢&#xff…

前端css中keyframes(关键帧)的简单使用

前端css中keyframes的使用 一、前言二、例子(一)、例子源码1(二)、源码1运行效果1.视频效果2.截图效果 三、结语四、定位日期 一、前言 关键帧keyframes是css动画的一种,主要用于定义动画过程中某一阶段的样式变化&am…

【小白误闯】这可能是对 Tomcat 工作原理解释最详细的文章

脑子一闪而过,当年 V 哥在面试 Java 开发时,被问到让你写一个 Tomcat 服务器,你有什么想法?尼码,面试官摆明是在压工资了,你得逞了,我回答不上来,当时也没研究过 Tomcat 的源码&…

Codeforces Round 940 E. Carousel of Combinations 【威尔逊定理】

题意 给定一个正整数 n n n,定义 C ( i , j ) C(i, j) C(i,j) 为:从 ( 1 , 2 , 3 , . . . , i ) (1,2,3,...,i) (1,2,3,...,i) 中选出 j j j 个不同的数,构成一个圆排列的不同的方案数 求出: ∑ i 1 n ∑ j 1 i ( C ( i ,…

STM32的GPIO控制寄存器开发

寄存器GPIO控制 寄存器地址 寄存器地址计算 某个寄存器地址,由三个参数决定:1、总线基地址(BUS_BASE_ADDR);2,外设基于总线基地址的偏移量(PERIPH_OFFSET);3&#xff…