概念

桥接模式(Bridge Pattern)是设计模式中最复杂的模式之一,它把事物对象和该对象的具体行为、具体特征分离开来,使它们可以独自进行变化和更改。这样的解释可能比较抽象和令人费解,读者可以通过下面的应用场景进一步来理解。

应用场景

我们还以绘制图形为例,比如我们要绘制矩形Rectangle、Circle、Triangle,我们需要至少需要定义3个形状类来表示,如果我们要绘制的图形还有不同的颜色,如Red、Yello、Green等,此时我们可能有一下两种设计方案:

  1. 为每个形状类都提供颜色的实现,比如通过继承增加RedRectangle、YellowRectangle、RedCircle、YellowCircle等
  2. 根据实际需要对具体形状对象颜色属性进行组合,把颜色属性作为参数动态给到形状对象来使用,比如红色的圆形就是组合 Circle + RedAttr

如果一个有两个及以上的变化维度的系统(或对象),采用方案2可以明显减少类的维护个数,扩展起来更为方便。方案2即为桥接模式的应用,它使用组合关联关系,而不是通过继承来做扩展,这减少了类之间的耦合,减少代码的编写量。

用过Java Swing进行过图形界面开发的读者发现,界面的风格(Look and Feel)在不同操作系统下是不一样的,实际上Java为每一个GUI组件都提供了一个Peer构件,该构件在不同操作系统下有不同的实现,Swing的Peer架构就是应用了桥接模式。

在以下情况下我们可以尝试使用桥接模式:

  • 一个类存在两个独立变化的维度,且这两个维度都需要独立扩展,这样有利于开发者单独去维护维度的扩展,而不需要关注其他维度的实现
  • 继承,尤其是多层次的继承会使得类的个数和理解复杂度都急剧增加,此时桥接模式尤为适用

结构桥接模式包含以下角色:

  • Abstraction:抽象类
  • RefinedAbstraction:扩充抽象类
  • Implementor:扩展行为或属性的接口定义(这里需要特别注意,这是Abstraction的行为或特征的实现类接口,翻译后确实词不达意)
  • ConcreteImplementor:Implementor的具体实现类

桥接模式就是将Abstraction的一些行为或属性独立的再抽象到Implementor中,在Abstraction(或RefinedAbstraction)中通过组合来动态的将Implementor的实现ConcreteImplementor组合起来,而不是用典型的继承关系来做扩展。这样就实现了一个对象(或系统)跟它的行为(或属性)能够通过不同的类单独去扩展和变化,再通过引用关系组合起来,这就是所谓的桥接。

代码示例

/** "Implementor" */
interface DrawingAPI {public void drawCircle(double x, double y, double radius);
}/** "ConcreteImplementorA" 1/2 */
class DrawingAPI1 implements DrawingAPI {public void drawCircle(double x, double y, double radius) {System.out.printf("API1.circle at %f:%f radius %f\n", x, y, radius);}
}/** "ConcreteImplementorB" 2/2 */
class DrawingAPI2 implements DrawingAPI {public void drawCircle(double x, double y, double radius)  { System.out.printf("API2.circle at %f:%f radius %f\n", x, y, radius);}
}/** "Abstraction" */
interface Shape {public void draw();                             // low-levelpublic void resizeByPercentage(double pct);     // high-level
}/** "Refined Abstraction" */
class CircleShape implements Shape
{private double x, y, radius;private DrawingAPI drawingAPI;public CircleShape(double x, double y, double radius, DrawingAPI drawingAPI) {this.x = x;  this.y = y;  this.radius = radius; this.drawingAPI = drawingAPI;}// low-level i.e. Implementation specificpublic void draw() {drawingAPI.drawCircle(x, y, radius);}   // high-level i.e. Abstraction specificpublic void resizeByPercentage(double pct) {radius *= pct;}
}/** "Client" */
class BridgePatternDemo {public static void main(String[] args) {Shape[] shapes = new Shape[2];shapes[0] = new CircleShape(1, 2, 3, new DrawingAPI1());shapes[1] = new CircleShape(5, 7, 11, new DrawingAPI2());for (Shape shape : shapes) {shape.resizeByPercentage(2.5);shape.draw();}}
}

输出:

API1.circle at 1:2 7.5
API2.circle at 5:7 27.5

优缺点

优点:

  • 桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法。

  • 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。

  • 实现细节对客户透明,可以对用户隐藏实现细节。

缺点:

  • 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进

行设计与编程。

  • 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。

作业

最后,我们给读者留一个作业:我们需要开发一个跨平台的视频播放器,在不同操作系统平台(Windows、Linux、MacOS等)上,除了可以播放多种格式的视频文件(MPEG、RMVB、AVI、WMV等),还可以播放多种格式的音频文件(WAV、MP3、AAC、OGG等),该如何进行设计呢?

设计模式之桥接模式(Bridge Pattern):我允许你的自我,减去的是羁绊,留下的牵挂相关推荐

  1. 如何让孩子爱上设计模式 ——10.桥接模式(Bridge Pattern)

    如何让孩子爱上设计模式 --10.桥接模式(Bridge Pattern) 标签: 设计模式初涉 我有故事,你有酒吗?这年头写个技术文不讲个故事都不行,行,我讲: 还有发现很多的技术博文都开始有喜欢往 ...

  2. 【愚公系列】2021年12月 二十三种设计模式(七)-桥接模式(Bridge Pattern)

    文章目录 前言 一.桥接模式(Bridge Pattern) 二.使用步骤 角色 示例 总结 优点 缺点 使用场景 前言 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分 ...

  3. 【设计模式自习室】桥接模式 Bridge Pattern:处理多维度变化

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...

  4. Net设计模式实例之桥接模式( Bridge Pattern)(4)

    3.客户端代码<?XML:NAMESPACE PREFIX = O /> static void <?XML:NAMESPACE PREFIX = ST2 />Main(str ...

  5. 极速理解设计模式系列:7.桥接模式(Bridge Pattern)

    四个角色:抽象类(Abstraction).扩充抽象类(RefinedAbstraction).实现类接口(Implementor).具体实现类(ConcreteImplementor) 抽象类(Ab ...

  6. Net设计模式实例之桥接模式( Bridge Pattern)(2)

    四.桥接模式实例分析(Example) 1.场景 业务对象(BusinessObject)与数据对象(DataObject)分离,即业务对象CustormerBase与数据对象DataObject分离 ...

  7. 【设计模式·结构型】桥接模式Bridge Pattern

    目的 该模式用于分离抽象与实现,并且抽象与实现可以独立变化 应用场景 (1)希望抽象和实现之间没有固定的绑定关系,不同抽象接口和实现可以组合和扩充,程序运行时动态选择.切换具体实现 (2)类层次结构, ...

  8. 设计模式之桥接模式(Bridge)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

  9. 设计模式之—— 桥接模式 Bridge

    定义 将抽象与实现分离,使它们可以独立变化. 他是用 组合关系 代替 继承关系 ,从而降低了抽象和实现两个维度的耦合度. 结构和实现 桥接模式包含以下角色: 抽象化角色:定义抽象类,并包含一个对实现化 ...

  10. 桥接模式(Bridge Pattern)

    桥接模式概述 定义:将抽象部分与它的实现部分解耦,使得两者都能够独立的变化 就拿我们日常使用的蜡笔来说,蜡笔有不同的大小和颜色,所以我们往往买的蜡笔盒中会有不少的蜡笔.需要用哪个就用哪个,是不是很方便 ...

最新文章

  1. 显示服务器图片url,服务器上图片的url地址
  2. 命令行设置Java环境变量
  3. DL之DNN:自定义MultiLayerNet【6*100+ReLU,SGD】对MNIST数据集训练进而比较【多个超参数组合最优化】性能
  4. flash AS3.0访问加载的SWF文件中的属性、方法以及类、库中的影片剪辑
  5. QT的QListWidget类的使用
  6. Service 深度解析
  7. ubuntu declare
  8. java异步线程内存可见性实验
  9. mysql 阿里云 版本_关于阿里云centos版本,mysql5.7的一些注意事项
  10. 英语学习笔记2019-12-06
  11. superoneclick 2.2_一季度食品监督抽检2.2%不合格:农兽药残留超标等系主因
  12. Excel 关于新建xls文件 新建sheet 合并sheet的VBA操作代码
  13. android dlna 小米电视盒子,小米电视DLNA投屏到电视步骤详解
  14. 树莓派I2C通过Shell操作FDC2214
  15. 我的2023届秋招之旅
  16. arcgis地理空间数据库学习记录05-管理分布式数据库
  17. Redis的内存碎片
  18. 计算机网络基础 网络互联设备和多层交换
  19. Python实现 天天向上的力量(嵩天老师)
  20. MATLAB连续LTI系统的时域分析(十)

热门文章

  1. 好马要配好鞍!程序员各路傍身神器排行榜!!!
  2. Wifi连接有密码的SSID是wifiManager.addNetwork返回为-1
  3. Elasticsearch数据结构——倒排索引
  4. java 按钮跳转页面_java按钮实现页面跳转 | 学步园
  5. 率土之滨服务器维护多久,率土之滨日常维护多久,群雄逐鹿训练有素多久能买...
  6. python mysqldb pymysql_mysqldb与pymysql
  7. oracle数据库中nvarchar,Oracle数据库中的varchar,varchar2,nvarchar,nvarchar2区别及用
  8. 显示器分辨率一直跳_Win7分辨率经常发生变化怎么办|Win7分辨率经常发生变化的解决方法...
  9. 利用css实现浮雕效果示例代码
  10. 动态规划——0/1背包问题(全网最细+图文解析)