设计模式:桥接模式

news/2024/5/19 12:41:15

文章目录

  • 一、什么是桥接模式
  • 二、桥接模式结构
  • 三、桥接模式的应用场景
    • 1、桥接模式适用的业务场景
    • 2、桥接模式适用的具体的业务场景

一、什么是桥接模式

接模式是一种对象结构型模式,它将抽象部分与它的实现部分分离,使它们都可以独立地变化。这种分离允许抽象和实现部分独立地扩展,而不会相互影响。桥接模式基于类的最小设计原则,通过封装、聚合及继承等行为让不同的类承担不同的职责。

二、桥接模式结构

在这里插入图片描述
桥接模式包含以下主要角色:

  • 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
  • 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  • 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。

在Java中,桥接模式可以通过接口和抽象类来实现。下面是一个简单的桥接模式的Java实现示例:

// 实现化角色接口  
public interface Implementor {  void operationImpl();  
}  // 实现化角色A的具体实现  
public class ConcreteImplementorA implements Implementor {  @Override  public void operationImpl() {  System.out.println("ConcreteImplementorA operation");  }  
}  // 实现化角色B的具体实现  
public class ConcreteImplementorB implements Implementor {  @Override  public void operationImpl() {  System.out.println("ConcreteImplementorB operation");  }  
}  // 抽象化角色  
public abstract class Abstraction {  protected Implementor implementor;  // 构造器传入实现化对象  public Abstraction(Implementor implementor) {  this.implementor = implementor;  }  // 声明业务方法  public abstract void operation();  // 模板方法,调用实现化方法  protected void operationImpl() {  if (implementor != null) {  implementor.operationImpl();  }  }  
}  // 扩展抽象化角色A  
public class RefinedAbstractionA extends Abstraction {  public RefinedAbstractionA(Implementor implementor) {  super(implementor);  }  // 实现业务方法  @Override  public void operation() {  System.out.println("RefinedAbstractionA operation");  operationImpl(); // 调用实现化方法  }  
}  // 客户端代码  
public class Client {  public static void main(String[] args) {  // 创建实现化对象  Implementor implementorA = new ConcreteImplementorA();  Implementor implementorB = new ConcreteImplementorB();  // 创建抽象化对象并传入实现化对象  Abstraction abstractionA = new RefinedAbstractionA(implementorA);  Abstraction abstractionB = new RefinedAbstractionA(implementorB);  // 调用业务方法  abstractionA.operation(); // 输出: RefinedAbstractionA operation  //       ConcreteImplementorA operation  abstractionB.operation(); // 输出: RefinedAbstractionA operation  //       ConcreteImplementorB operation  }  
}

在这个例子中,Implementor是实现化角色接口,ConcreteImplementorA和ConcreteImplementorB是具体的实现类。Abstraction是抽象化角色,其中包含一个对实现化角色的引用,并定义了一个抽象的业务方法operation()。RefinedAbstractionA是扩展抽象化角色,实现了operation()方法,并调用了实现化角色的方法。

在客户端代码中,我们创建了两个不同的实现化对象,并将它们分别传递给扩展抽象化对象。然后,我们调用扩展抽象化对象的业务方法,该方法会首先输出自己的业务逻辑,然后调用实现化对象的方法。

这样,抽象化角色和实现化角色就可以独立地变化,它们之间的耦合度被降低了。如果需要添加新的实现化角色或扩展抽象化角色,只需要在相应的位置添加新的类即可,而不需要修改已有的代码。

三、桥接模式的应用场景

1、桥接模式适用的业务场景

  • 在抽象和具体实现之间需要增加更多的灵活性的场景。
  • 一个类存在两个或多个独立变化的维度,而这两个或多个维度都需要独立进行扩展。
  • 不希望使用继承,或因为多层继承导致系统类的个数剧增。桥接模式的一个常用场景就是为了替换继承。

通过桥接模式,可以实现系统从多个维度进行分类,将各维度抽象出来,各维度独立变化,之后可通过聚合,将各维度组合起来,减少了各维度间的耦合。这种设计模式可以提高代码的灵活性、可重用性和可扩展性。

2、桥接模式适用的具体的业务场景

  • 跨平台软件开发:当需要开发一个可以在多种操作系统或硬件平台上运行的应用程序时,可以使用桥接模式。例如,图形用户界面(GUI)的组件可以设计为抽象的,而具体的渲染逻辑则依赖于特定的平台实现。

  • 多种数据源的访问:当需要访问多种数据源(如数据库、文件、网络服务等)时,可以使用桥接模式。在这种情况下,数据源访问的抽象接口可以保持不变,而具体的访问实现则可以根据数据源类型进行变化。

  • 多种产品系列:在产品线中,可能存在多个产品系列,每个系列都有其独特的特点和实现方式。使用桥接模式,可以将产品的抽象部分(如接口或基类)与具体实现部分(如不同系列的实现)分离,从而简化产品线的维护和扩展。

  • 可扩展的图形库:在图形库中,可能需要支持多种图形形状和渲染方式。使用桥接模式,可以将图形的抽象定义(如形状、大小、颜色等)与具体的渲染实现(如OpenGL、DirectX等)分离,使得图形库更加灵活和可扩展。

  • 插件式架构:在插件式架构中,主程序提供一个稳定的接口或抽象类,而具体的功能则由插件来实现。桥接模式可以用于这种场景,将主程序的抽象部分与插件的具体实现部分分离,使得插件可以独立地开发、测试和替换。

  • 复杂的系统配置:在某些复杂的系统中,可能需要根据用户的不同需求或环境的不同配置来调整系统的行为。使用桥接模式,可以将系统的配置抽象为接口或基类,而将具体的配置实现作为实现化角色进行分离。这样,可以方便地切换不同的配置实现,以满足不同的需求。

  • 多语言支持:在需要支持多种语言的软件中,可以使用桥接模式将语言的抽象定义(如字符串、日期格式等)与具体的语言实现(如英文、中文、法文等)分离。这样,可以方便地添加新的语言支持或修改现有语言的实现。

总的来说,桥接模式适用于那些需要将抽象部分与实现部分分离、减少它们之间耦合度的场景。通过桥接模式,可以使得抽象部分和实现部分能够独立地变化,从而提高系统的灵活性和可扩展性。


http://www.mrgr.cn/p/22113240

相关文章

《动手学深度学习(Pytorch版)》Task03:线性神经网络——4.29打卡

《动手学深度学习(Pytorch版)》Task03:线性神经网络 线性回归基本元素线性模型损失函数随机梯度下降 正态分布与平方损失 线性回归的从零开始实现读取数据集初始化模型参数定义模型定义损失函数定义优化算法训练 线性回归的简洁实现读取数据集…

百舸实践之「埋点数据深度治理与应用」 | 京东云技术团队

一、背景 随着公司和业务的不断发展,百舸平台也从单一内容投放转向了以流量和数据为基础的流量运营模式。在这个转变过程中,数据深度治理与应用的重要性尤为凸显,在数据深度治理过程中,需要将用户行为数据、投放素材以及投放效果三者紧密的串联起来。数据深度治理和应用,一…

【网络原理】HTTPS 的工作过程

系列文章目录 【网络通信基础】网络中的常见基本概念 【网络编程】网络编程中的基本概念及Java实现UDP、TCP客户端服务器程序(万字博文) 【网络原理】UDP协议的报文结构 及 校验和字段的错误检测机制(CRC算法、MD5算法) 【网络…

【数据结构(邓俊辉)学习笔记】列表03——有序列表

文章目录 0. 概述1. 唯一化2. 查找2.1 实现2.2 顺序查找2.3 复杂度 0. 概述 介绍下有序列表。 若列表中所有节点的逻辑次序与其大小次序完全一致,则称作有序列表(sorted list)。为保证节点之间可以定义次序,依然假定元素类型T直接…

【进阶篇】基于 Redis 实现分布式锁的全过程

这一篇文章拖了有点久,虽然在项目中使用分布式锁的频率比较高,但整理成文章发布出来还是花了一点时间。在一些移动端、用户量大的互联网项目中,经常会使用到 Redis 分布式锁作为控制访问高并发的工具。目录前言一、关于分布式锁二、RedLock 红锁(不推荐)三、基于 setIfAbs…

视频的二维码是怎么做的?快速实现扫码看视频的方法

视频的二维码现在有很多的应用场景,用这种方式来分享视频能够实现视频的快速传播,现在用户大多习惯通过扫码的方式来获取信息,二维码可以提供更好的用户体验。 以二维码为媒介来存储视频时,可以使用视频二维码生成器来快速制作相…

pdf.js源码解析-渲染的时序分析

首先来一张总结的图,也就是pdf.js在解析和渲染pdf的一个时序图,下图:首先要明白,pdf.js在渲染pdf的时候是做分层渲染,也就是时间展现的内容是通过canvas进行绘制的,而我们通过鼠标进行选择时候的内容是通过dom进行普通渲染,也就是 <div>123</div> 这样的普通…

权威SAFe大规模敏捷企业级内训及SAFe敏捷认证

​ SAFe – Scaled Agile Framework是目前全球运用最广泛的大规模敏捷框架,也是成长最快、最被认可、最有价值的规模化敏捷框架,目前全球SAFe认证专业人士已达80万人,福布斯100强的70%都在实施SAFe。本课程是一个2天的 SAFe权威培训课程,在课程中,学员将系统地学习大规模敏…

Flutter笔记:Widgets Easier组件库(2)阴影盒子

Flutter笔记 Widgets Easier组件库&#xff08;2&#xff09;&#xff1a;阴影盒子 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress o…

nuxt3使用记录六:禁用莫名其妙的Tailwind CSS(html文件大大减小)

发现这个问题是因为&#xff0c;今天我突然很好奇&#xff0c;我发现之前构建的自动产生的200.html和404.html足足290k&#xff0c;怎么这么大呢&#xff1f;不是很占用我带宽&#xff1f; 一个啥东西都没有的静态页面&#xff0c;凭啥这么大&#xff01;所以我就想着手动把他…

ping ip、域名、端口

一、pingping baidu.com ping 192.168.9.9 综上所诉,ping命令的时候格式为(注意ping后面需要跟上一个空格) ①ping IP地址或主机域名 ②ping IP地址或主机域名+命令参数 ③ ping 命令参数+IP地址或主机域名 ping命令参数说明查看ping命令帮助 ping /? 输入上面的命令,我们…

leetcode-缺失的第一个正整数-96

题目要求 思路 1.这里的题目要求刚好符合map和unordered_map 2.创建一个对应map把元素添加进去&#xff0c;用map.find(res)进行查找&#xff0c;如果存在返回指向该元素的迭代器&#xff0c;否则返回map::end()。 代码实现 class Solution { public:int minNumberDisappeare…

使用QT完成如图的游戏登录界面 使用信号和槽完成密文明文密码转换,重置账号和密码,登录校验 详细代码在主页下载

头文件: #ifndef LOGINWIDGET_H #define LOGINWIDGET_H #include <QLineEdit> #include <QPushButton> #include <QWidget> class LoginWidget : public QWidget {Q_OBJECT public: LoginWidget(QWidget *parent = 0); ~LoginWidget(); public slots: …

探索企业级项目管理的最优策略

企业的项目管理应该采取综合性的方式,结合多种工具和方法来确保项目的成功。zz-plan 甘特图是其中一种非常有用的工具,它可以帮助项目经理和团队成员可视化地展示项目的时间线和进度。以下是采取合适项目管理方式时需要考虑的几个关键点,结合甘特图的使用: 项目规划:在项目…

Redis开源社区持续壮大,华为云为Valkey项目注入新的活力

作为Valkey社区的Technical Steering Committee member,华为云将持续参与社区建设。摘要:作为Valkey社区的Technical Steering Committee member,华为云将持续参与社区建设。一、背景 今年3月21日,Redis Labs宣布从Redis 7.4版本开始,将原先比较宽松的BSD源码使用协议修改…

TigerTrade

目录 老虎国际纳斯达克上市公司 Windows客户端软件 主界面 个股页面,采用左中右方式布局,左侧自选列表,中间图表,右侧是自选和下单器。图表正下方是资产、持仓和订单模块,该模块支持隐藏。持仓和订单闪电下单 闪电下单器,旨在为用户提供更快捷的下单方式闪电下单设置页面…

激光打印机打印唐草纹路流程

一、先弄一张 唐草.png 图片 大概长这样ps 抠图出来 然后 菜单栏 编辑 =》 自由变换 然后导出png 成了这个样子二、 使用 CorelDRAW X4 SP2 精简版 导入这个图 1 菜单栏 位图 =》 转换为 位图 2 菜单栏 位图 =》 轮廓描摹 =》 线条图 大概长这样3 导出为 plt 文件 三、 使用…

【HEVC简介】CTU、CU、PU、TU结构

参考文献:见《High Efficiency Video Coding (HEVC)》Block Structures and Parallelism Features in HEVC章节CTU:coding tree unit,编码树单元,LCU对于YUV=420格式的彩色视频:一个CTU由一个CTB of the luma samples 、2个CTBs of the chroma samples和相关的语法元素组成…

FileBird Pro插件下载:革新您的WordPress媒体库管理

WordPress媒体库是您网站的重要组成部分&#xff0c;它存储了所有的图片、视频、文档等文件。但随着网站的扩展&#xff0c;媒体库的管理变得越来越复杂。FileBird Pro插件&#xff0c;作为一款专为WordPress用户设计的媒体库管理工具&#xff0c;以其直观的界面和强大的功能&a…