1.定义

桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。

问题:
这里的抽象与实现是什么意思呢?先来看一个例子:
假如你有一个几何形状Shape类,从它能扩展出两个子类: ​ 圆形Circle和 方形Square 。 你希望对这样的类层次结构进行扩展以使其包含颜色,所以你打算创建名为红色Red和蓝色Blue的形状子类。 但是, 由于你已有两个子类, 所以总共需要创建四个类才能覆盖所有组合, 例如 蓝色圆形Blue­Circle和 红色方形Red­Square 。

在层次结构中新增形状和颜色将导致代码复杂程度指数增长。 例如添加三角形状, 你需要新增两个子类, 也就是每种颜色一个; 此后新增一种新颜色需要新增三个子类, 即每种形状一个。 照这样下去,所有组合类的数量将以几何级数增长,情况会越来越糟糕。

解决方案:
问题的根本原因在于我们试图在两个独立的维度——形状与颜色上进行扩展。这在处理继承时是很常见的问题。

桥接模式 通过将继承改为组合的方式来解决这个问题。 具体来说, 就是抽取其中一个维度并使之成为独立的类层次, 这样就可以在初始类中引用这个新层次的对象, 从而使得一个类不必拥有所有的状态和行为。

根据该方法, 我们可以将颜色相关的代码抽取到拥有 红色和 蓝色两个子类的颜色类中, 然后在 形状类中添加一个指向某一颜色对象的引用成员变量。 现在, 形状类可以将所有与颜色相关的工作委派给连入的颜色对象。 这样的引用就成为了 形状和 颜色之间的桥梁。 此后, 新增颜色将不再需要修改形状的类层次, 反之亦然。

2.适用环境

  • 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
  • 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
  • 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。

3.模式结构图


其中包含如下角色:

  • Abstraction(抽象类):用于定义抽象类的接口,它一般是抽象类而不是接口,其中定义了一个 Implementor(实现类接口)类型的对象并可以维护该对象,它与 Implementor 之间具有关联关系。
  • RefinedAbstraction(提炼抽象类):扩充由 Abstraction 定义的接口,通常情况下它不再是抽象类而是具体类,它实现了在 Abstraction 中声明的抽象业务方法,在 RefinedAbstraction 中可以调用在 Implementor 中定义的业务方法。
  • Implementor(实现类接口):定义实现类的接口,这个接口不一定要与 Abstraction 的接口完全一致,事实上这两个接口可以完全不同,一般而言,Implementor 接口仅提供基本操作,而 Abstraction 定义的接口可能会做更多更复杂的操作。Implementor 接口对这些基本操作进行了声明,而具体实现交给其子类。通过关联关系,在 Abstraction 中不仅拥有自己的方法,还可以调用到 Implementor 中定义的方法,使用关联关系来替代继承关系。
  • ConcreteImplementor(具体实现类):具体实现 Implementor 接口,在不同的 ConcreteImplementor 中提供基本操作的不同实现,在程序运行时,ConcreteImplementor 对象将替换其父类对象,提供给抽象类具体的业务操作方法。

4.实例

我们就以上述形状与颜色这两个独立的维度来实现给不同的形状刷上不同颜色的例子来讲解:
ColorAPI :用于画各种颜色的接口

/*** Created on 2020/3/18* Package com.design_pattern.bridge** @author dsy*/
public interface ColorAPI {public void paint();
}

BlueColorAPI :画蓝色的实现类

/*** Created on 2020/3/18* Package com.design_pattern.bridge** @author dsy*/
public class BlueColorAPI implements ColorAPI {@Overridepublic void paint() {System.out.println("画上蓝色");}
}

RedColorAPI :画红色的实现类

/*** Created on 2020/3/18* Package com.design_pattern.bridge** @author dsy*/
public class RedColorAPI implements ColorAPI
{@Overridepublic void paint() {System.out.println("画上红色");}
}

Shape :抽象形状类

/*** Created on 2020/3/18* Package com.design_pattern.bridge** @author dsy*/
public abstract class Shape {protected ColorAPI colorAPI;    //添加一个颜色的成员变量以调用ColorAPI 的方法来实现给不同的形状上色public void setDrawAPI(ColorAPI colorAPI) {      //注入颜色成员变量this.colorAPI= colorAPI;}public abstract void draw();
}

Circle :圆形类

/*** Created on 2020/3/18* Package com.design_pattern.bridge** @author dsy*/
public class Circle extends Shape {@Overridepublic void draw() {System.out.print("我是圆形");colorAPI.paint();}
}

Rectangle :长方形类

/*** Created on 2020/3/18* Package com.design_pattern.bridge** @author dsy*/
public class Rectangle extends Shape {@Overridepublic void draw() {System.out.print("我是长方形");colorAPI.paint();}
}

Client:客户端

/*** Created on 2020/3/18* Package com.design_pattern.bridge** @author dsy*/
public class Client {public static void main(String[] args) {//创建一个圆形Shape shape = new Circle();//给圆形蓝色的颜料shape.setDrawAPI(new BlueColorAPI());//上色shape.draw();//创建一个长方形Shape shape1 = new Rectangle();//给长方形红色的颜料shape1.setDrawAPI(new RedColorAPI());//上色shape1.draw();}
}

打印输出:

我是圆形画上蓝色
我是长方形画上红色

假如现在客户让我们增了一个三角形,我们只需要新增一个三角形类就可以了,而无需把每一种颜色都增加一个,我们在客户端调用时只需按照需求来挑选即可:

/*** Created on 2020/3/18* Package com.design_pattern.bridge** @author dsy*/
public class Triangle extends Shape {@Overridepublic void draw() {System.out.println("我是三角形");colorAPI.paint();}
}

增加颜色也是一样,我们只需要增加一个新的颜色并实现ColorAPI的接口即可,而无需更改类的层次,例如增加一个绿色:

/*** Created on 2020/3/18* Package com.design_pattern.bridge** @author dsy*/
public class GreenColorAPI implements ColorAPI {@Overridepublic void paint() {System.out.println("画上绿色");}
}

现在再来看“将抽象部分与他的实现部分分离”这句话,实际上就是在说实现系统可能有多个角度分类(例如例子中的形状与颜色),每一种分类都有可能变化,那么把这种多角度分离出来让他们独立变化,减少他们之间的耦合。

5.优缺点分析

优点:

  • 实现抽象和实现的分离
  • 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统
  • 桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法

缺点:

  • 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
  • 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。

桥接模式(Bridge Pattern)-(最通俗易懂的案例)相关推荐

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

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

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

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

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

    如何让孩子爱上设计模式 --10.桥接模式(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)

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

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

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

  9. 设计模式(16):结构型-桥接模式(Bridge)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  10. c++桥接模式bridge

    c++桥接模式bridge 概念 角色和职责 适用于 案例 概念 Bridge 模式又叫做桥接模式,是构造型的设计模式之一.Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不 ...

最新文章

  1. 如何调试分析Android中发生的tombstone
  2. 时隔这么长时间,又回来写博客了
  3. 如何用SQL分析电商用户行为数据(案例)
  4. C++ 析构函数设为虚函数的好处
  5. spring boot 源码分析(七) 事件机制 之 SpringApplicationEvent
  6. 解决MacOS升级后出现xcrun: error: invalid active developer path, missing xcrun的问题
  7. POJ 3415 (后缀数组)
  8. sql报错SELECT list is not in GROUP BY clause and contains nonaggregated column
  9. 最新版MATLAB怎么运行代码,matlab怎么运行代码
  10. 金融计算机求log,cfa计算器怎么算对数
  11. java 立体几何体中心点,高中数学立体几何重心考点的解题技巧_招生指南
  12. 51单片机undefined identifier问题求助
  13. 中国消费者偏爱,复古游戏机与相机成为时代新宠,你会喜欢吗?
  14. 吉度盘点机PDA盘点生成的条码和数量导入库存Excel表
  15. cmd命令行窗口调整大小
  16. android 6.0 7.0,Android 6.0/7.0可升级机型名单出炉
  17. 教资有小学计算机吗,小学有没有信息技术教师资格证考试?
  18. IMEI、iccid、MDN、MSIN、IMSI
  19. QQ 不也有语音功能吗,为什么微信会有市场?
  20. 315Mhz、433Mhz无线遥控信号的解码分析和模拟

热门文章

  1. 性别歧视?华为、小米们为什么不做男性手机?
  2. 抖音直播带货推流机制是什么?怎么跑好直播带货30分钟循环过款模型?
  3. steam/csgo搬砖项目详解
  4. EXFAT文件系统的数据恢复教程-李林峰-专题视频课程
  5. Hugging Face 每周速递: Space 支持创建模版应用、Hub 搜索功能增强、BioGPT-Large 还有更多...
  6. php避免网页出现运营商劫持,防止运营商劫持,前端解决办法
  7. 无线登录方式花生壳自建网站不稳处理方法
  8. 沉睡者C - 网赚其实就是打造自己的赚钱系统
  9. Maven:Failure to transfer XXXXX from https://repo.maven.apache.org/maven2
  10. java recursion_Java递归(Recursion)