概念

Bridge模式即桥接模式。顾名思义,这个模式的作用是将类的功能层次结构和类的实现层次结构连接起来。

  • 功能层次结构
Something
-SomethingGood
-SomethingBetter

子类添加父类没有的功能,他们之间的结构就是功能层次结构。

  • 实现层次结构
AbstractClass
-ConcreteClass
-AnotherConcreteClass

模板方法模式为例,父类声明了抽象方法,定义了抽象方法的使用方式;子类继承并实现了抽象方法——实现了职责分离:父类关心流程,子类关心实现细节,就像领导负责派发任务,职员负责完成任务。这样的父类和子类的关系就是一个实现层次结构。注意一点:子类没有增加功能,只是实现了功能

在增加子类时,要分清楚:我是要增加新功能,还是要增加另一种实现?如果混在一起,结构就会复杂,不清楚;

但如果完全分开,他们就会缺少联系,因此我们需要搭建一座桥梁——桥接模式,具体做法:使用继承扩展功能、使用委托实现功能

代码

  • 父类
public class Display {
private DisplayImpl displayImpl;
public Display(DisplayImpl displayImpl) {
this.displayImpl = displayImpl;
} public void open() {
displayImpl.rawOpen();
}
public void print() {
displayImpl.rawPrint();
}
public void close() {
displayImpl.rawClose();
}
public final void display() {
open();
print();
close();
}
}
  • 类的功能层次结构
public class CountDisplay extends Display{
public CountDisplay(DisplayImpl displayImpl) {
super(displayImpl);
} public void multiDisplay(int times) {
open();
for (int i = 0; i < times; i++) {
print();
}
close();
}
}
  • 类的实现层次结构
public abstract class DisplayImpl {
public abstract void rawOpen();
public abstract void rawPrint();
public abstract void rawClose();
}
public class StringDisplayImpl extends DisplayImpl {
private String string; // 要显示的字符串
private int width; // 以字节单位计算出的字符串的宽度
public StringDisplayImpl(String string) { // 构造函数接收要显示的字符串string
this.string = string; // 将它保存在字段中
this.width = string.getBytes().length; // 把字符串的宽度也保存在字段中,以供使用。
}
public void rawOpen() {
printLine();
}
public void rawPrint() {
System.out.println("|" + string + "|"); // 前后加上"|"并显示
}
public void rawClose() {
printLine();
}
private void printLine() {
System.out.print("+"); // 显示用来表示方框的角的"+"
for (int i = 0; i < width; i++) { // 显示width个"-"
System.out.print("-"); // 将其用作方框的边框
}
System.out.println("+"); // 显示用来表示方框的角的"+"
}
}
  • 运行
public static void main(String[] args) {
Display d1 = new Display(new StringDisplayImpl("Hello, China."));
Display d2 = new CountDisplay(new StringDisplayImpl("Hello, World."));
CountDisplay d3 = new CountDisplay(new StringDisplayImpl("Hello, Universe."));
d1.display();
d2.display();
d3.display();
d3.multiDisplay(5);
} /*结果*/
+-------------+
|Hello, China.|
+-------------+
+-------------+
|Hello, World.|
+-------------+
+----------------+
|Hello, Universe.|
+----------------+
+----------------+
|Hello, Universe.|
|Hello, Universe.|
|Hello, Universe.|
|Hello, Universe.|
|Hello, Universe.|
+----------------+

角色

Abstraction(抽象化):位于类的功能层次结构的最上层,定义了最基本的功能,保存了Implementor的实例,在本例中,由Display类实现。

RefinedAbstraction(改善后的抽象化):在Abstraction的基础上增加新功能的角色,在本例中,由CountDisplay类扮演此角色。

Implementor(实现者):定义了用于实现Abstraction中的接口的方法,在本例中由DisplayImpl扮演此角色。

ConcreteImplementor(具体实现者):负责实现Implementor中定义的接口。在本例中,由StringDisplayImpl担任此角色。

类图

想法

  • 分开后更容易扩展

桥接模式的特点是将类的功能层次结构拓展和类的实现层次结构拓展分开了,这样的好处是有利于独立的对他们进行拓展。

举个例子,一套在Windows,MacOS,Linux上运行的软件,需要开发三个版本。我们可以利用桥接模式,定义一个Implementor,再编写每个版本对应的ConcreteImplementor,这样就完成了实现层次的开发。接下来,无论功能层次需要增加多少个功能,都可以在这三个操作系统上正常工作。

  • 继承和委托

继承是强关联关系,委托是弱关联关系。

观察Display类的open、close、print三个方法的实现,他们调用的都是DisplayImpl的方法。Display类将工作交给了DisplayImpl类,这就叫委托。我们可以实现各种各样的XXXDisplayImpl,将其作为参数传入Display的构造方法里面,在不改变Display类和DisplayImpl类的前提下修改实现。这就是委托所带来的好处。

《图解设计模式》读书笔记4-1 Bridge模式的更多相关文章

  1. HeadFirst设计模式读书笔记(3)-装饰者模式(Decorator Pattern)

    装饰者模式:动态地将责任附件到对象上.若要扩展功能,装饰者提东了比继承更有弹性的替代方案. 装饰者和被装饰对象有相同的超类型 你可以用一个或者多个装饰者包装一个对象. 既然装饰者和被装饰对象有相同的超 ...

  2. HeadFirst设计模式读书笔记--目录

    HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern) HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern) HeadFirst设计 ...

  3. Head First 设计模式读书笔记(1)-策略模式

    一.策略模式的定义 策略模式定义了算法族,分别封装起来,让它们之间可以互换替换,此模式让算法的变化独立使用算法的客户. 二.使用策略模式的一个例子 2.1引出问题 某公司做了一套模拟鸭子的游戏:该游戏 ...

  4. C#设计模式学习笔记:(10)外观模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7772184.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲结构型设计模式的第五个模式--外 ...

  5. C#设计模式学习笔记:(7)桥接模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7699301.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲结构型设计模式的第二个模式--桥 ...

  6. JavaScript设计模式:读书笔记(未完)

    该篇随我读书的进度持续更新阅读书目:<JavaScript设计模式> 2016/3/30 2016/3/31 2016/4/8 2016/3/30: 模式是一种可复用的解决方案,可用于解决 ...

  7. 图解http读书笔记

    以前对HTTP协议一知半解,一直不清楚前端需要对于HTTP了解到什么程度,知道接触的东西多了,对于性能优化.服务端的配合和学习中也渐渐了解到了HTTP基础的重要性,看了一些大神对HTTP书籍的推荐,也 ...

  8. Java设计模式学习笔记(二) 简单工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...

  9. Java设计模式学习笔记(三) 工厂方法模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...

  10. Java设计模式学习笔记(四) 抽象工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 抽象工厂模式概述 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问 ...

随机推荐

  1. node.js—创建、删除、追加文件等方法汇总

    使用Node.js的fs模块必须在electron项目里 /* 1. fs.stat 检测是文件还是目录(目录 文件是否存在) 2. fs.mkdir 创建目录 (创建之前先判断是否存在) 3. fs ...

  2. SpringBoot使用RestTemplate 摘要认证

    SpringBoot使用RestTempate SpringBoot使用RestTemplate摘要认证 SpringBoot使用RestTemplate基础认证 SpringBoot使用RestTe ...

  3. ### Error building SqlSession. ### The error may exist in SQL Mapper Configuration ### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibat

    这是一个由粗心导致的错误,具体报错如下: org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSessio ...

  4. C++之匿名对象与析构函数的关系

    #include <iostream> using namespace std; class Location{ public: Location(, ){ X = xx; Y = yy; ...

  5. P2731 骑马修栅栏 (欧拉路径)

    [题目描述] John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次.John能从任何一 ...

  6. Asp.net中GridView使用详解(很全,很经典)

    http://blog.csdn.net/hello_world_wusu/article/details/4052844 Asp.net中GridView使用详解 效果图参考:http://hi.b ...

  7. WPF的DataTrigger使用

    首先创建一个空的项目 然后看看前台写的代码,如下图所示 <Grid> <StackPanel HorizontalAlignment="Center" Verti ...

  8. STM32之红外遥控信号自学习实现

    一.序言 很早前就想实现这个红外遥控自学习的这个实验,用于来自己控制房子里如空调等红外遥控设备的自动化,NEC的标准到具体的产品上可能就被厂家定义为不一样了,所以自学习就应该是接收到什么就发送什么,不 ...

  9. ideamaven版的MBG逆向工程

    一.简介 简称MBG,是一个专门为MyBatis框架使用者定制的代码生成器,可以快速的根据表生成对应的映射文件,接口,以及bean类. 支持基本的增删改查,以及QBC风格的条件查询. 但是表连接.存储 ...

  10. Python3安装教程

    目录 1. 推荐阅读 2. 安装包下载 3. 安装步骤 1. 推荐阅读 Python基础入门一文通 | Python2 与Python3及VSCode下载和安装.PyCharm破解与安装.Python ...