概念

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. “希希敬敬对”团队--‘百度贴吧小爬虫’Alpha版本展示博客

    希希敬敬对的 Alpha阶段测试报告 随笔链接地址 https://www.cnblogs.com/xiaoyoushang/p/10078826.html   Alpha版本发布说明 随笔链接地址 ...

  2. ModelForm基本使用

    介绍 Django提供Form和ModelForm两种表单验证方式.相比较Form,ModelForm可以直接与与数据库表相关联,不需要像Form那样需要手动逐一字段添加表单验证的字段.且可以随意选择 ...

  3. Python库指南

    Python库指南 1.time模块 作用:time模块是一个时间模块,与datetime模块它提供的功能是更加接近于操作系统层面. 应用场景:平时用的比较多的时间戳,等时间方面的操作,在爬虫方面经常 ...

  4. echart 折线渐变 加柱形图结合图形,左右纵轴自设置格式,现行图北京渐变 ,x轴字体倾斜

    app.title = '折柱混合'; option = { grid: { left: '5%', //距离左边的距离 right: '5%', //距离右边的距离 top:'8%', bottom ...

  5. express通过生成器

    express通过生成器 [ 脚手架 ] 1. 作用:可以帮助快速构建一个express项目 2. 脚手架的安装 全局安装 [可以使用npm cnpm] $ cnpm i express-genera ...

  6. C++ CMake 入门实战[转载]

    C++ CMake 入门实战 2016-11-05 CMake用于跨平台的编译系统,对于通常的c/c++工程,都是通过make来进行编译的,CMake可以通过指令生成Makefile文件来指导整个项目 ...

  7. VUE CLI3.X 创建项目

    Node.js环境搭建 Node.js基于V8引擎,可以让js代码脱离浏览器运行 Vue CLI3.0 需要Node.js 8.9或者更高版本. 用nvm或者nvm-windows在同一台电脑中管理多 ...

  8. weblogic+idea

    1.首先是weblogic的安装,去官网下载,下载完成后,安装,然后还需要创建域,参考链接: https://www.cnblogs.com/xdp-gacl/p/4140683.html,创建域的h ...

  9. mysql 5.5和5.6版本关于timestamp not null类型字段关于null的处理

    Server version: 5.5.33-31.1-log Percona Server (GPL), Release rel31.1, Revision 566 mysql> CREATE ...

  10. 文本框的pattern属性

    代码实例: test.html <!DOCTYPE html><html lang="en"><head> <meta charset=& ...