概念

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

  • 功能层次结构
  1. Something
  2. -SomethingGood
  3. -SomethingBetter

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

  • 实现层次结构
  1. AbstractClass
  2. -ConcreteClass
  3. -AnotherConcreteClass

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

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

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

代码

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

角色

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. jsp自定义标签处理转义字符

    sun公司提供的jstl虽然比较强大,但是开发中很难满足我们所有的需求,并且开发也禁止在jsp中写很多java代码,因此很多场景需要自己定义标签进行项目开发 sun提供的标签库引用方式:<%@t ...

  2. 极*Java速成教程 - (2)

    Java语言基础 Java的一切都是以对象为基础,对象是生是死的生命周期由虚拟机管理,但是在创生和消亡阶段,需要我们去管理这个类怎么生,怎么死.我们也以此为契机,慢慢接触Java的诸多细节和具体实现. ...

  3. 让网站动起来!12款优秀的 jQuery 动画

    Textillate.js 介绍:Textillate.js 是一个简单的 CSS3 文本动画插件.结合了一些非常棒的库,把 CSS3 动画轻松应用到任何文本.只需要在项目中简单地引入 textill ...

  4. Linux快速访问多个目录

    Linux下实现多个目录之间快速切换 dirs -v # 显示栈目录dirs -c # 清空栈目录 pushd # 加入当前目录pushd director   #  加入指定目录pushd +/-i ...

  5. java 快速开发平台 有代码生成器 springmvc SSM后台框架源码

    .   权限管理:点开二级菜单进入三级菜单显示 角色(基础权限)和按钮权限      角色(基础权限): 分角色组和角色,独立分配菜单权限和增删改查权限.      按钮权限: 给角色分配按钮权限.2 ...

  6. 20191202IIS

    IIS和.netfw4.0安装顺序是从前到后,如果不小心颠倒了,无所谓. 打开程序-运行-cmd:输入一下命令重新注册IIS C:\WINDOWS\Microsoft.NET\Framework\v4 ...

  7. Form表单的主要Content-Type

    在Spa单页面横行的时代,前后端交互基本都是Json交互(也有通过FormData的,比如上传文件).而在之前的Jsp,Php前后不分家的时候,前后交互好大一部分都是通过Form表单来完成的.From ...

  8. 从excel表中生成批量SQL

    excel表格中有许多数据,需要将数据导入数据库中,又不能一个一个手工录入,可以生成SQL,来批量操作.   ="insert into Log_loginUser (LogID, Logi ...

  9. Robot Framework 源码阅读 day1 run.py

    robot里面run起来的接口主要有两类 run_cli def run_cli(arguments): """Command line execution entry ...

  10. 【杂记】mysql 左右连接查询中的NULL的数据筛选问题,查询NULL设置默认值,DATE_FORMAT函数

    MySQL左右连接查询中的NULL的数据筛选问题 xpression 为 Null,则 IsNull 将返回 True:否则 IsNull 将返回 False. 如果 expression 由多个变量 ...