文章目录

  • 桥接模式
    • 1. 为什么使用桥接模式
    • 2.使用桥接模式
      • 2.1 Abstraction
      • 2.2 RefinedAbstraction
      • 2.3 Implementor
      • 2.4 ConcreteImplementor
      • 2.5 将大家组合起来
  • 总结

设计模式是面向问题、场景而总结产生的设计思路。是解决问题的套路。23 种经典的设计模式。它们又可以分为三大类:创建型、结构型、行为型。

结构型 包含了 代理模式、 桥接模式、 装饰器模式、适配器模式、门面模式、组合模式、 享元模式。

桥接模式

桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。

1. 为什么使用桥接模式

桥接模式使用组合代替继承,使系统更加灵活,并易于扩展,同时有效控制了系统中类的个数。

在很多情况下,桥接模式可以取代多层继承方案,多层继承方案违背了“单一职责原则”,复用性较差,且类的个数非常多,桥接模式是比多层继承方案更好的解决方法,它极大减少了子类的个数。

如果某个类存在两个独立变化的维度,可以运用桥接模式将这两个维度分离出来,使两者可以独立扩展,让系统更加符合“单一职责原则”。桥接模式提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统,符合“开闭原则”。

2.使用桥接模式

桥接模式定义了四个角色,
Abstraction,持有Implementor,Implementor是代表了另一个维度。
RefinedAbstraction,继承Abstraction,因此可以调用在Implementor中定义的业务方法。
Implementor,定义了业务功能。
ConcreteImplementor,具体实现Implementor接口。

2.1 Abstraction

Abstraction角色,比如电脑类,持有一个对象,是操作系统。

public abstract class Computer {protected OperationSystem os;public Computer(OperationSystem os) {this.os = os;}public abstract void work();
}

2.2 RefinedAbstraction

比如苹果电脑、戴尔电脑等。

public class AppleComputer extends Computer{public AppleComputer(OperationSystem os) {super(os);}@Overridepublic void work() {System.out.println("Apple 笔记本,开机启动");os.run();}
}public class DellComputer extends Computer{public DellComputer(OperationSystem os) {super(os);}@Overridepublic void work() {System.out.println("Dell 笔记本,开机启动");os.run();}
}

2.3 Implementor

定义操作系统类

public abstract class OperationSystem {public abstract void run();
}

2.4 ConcreteImplementor

可以有linux、windows、macos等操作系统。

public class LinuxOperationSystem extends OperationSystem{@Overridepublic void run() {System.out.println("Linux操作系统,操作系统加载");}
}public class WindowsOperationSystem extends OperationSystem{@Overridepublic void run() {System.out.println("windows操作系统,操作系统加载");}
}public class MacOperationSystem extends OperationSystem{@Overridepublic void run() {System.out.println("Mac操作系统,操作系统加载");}
}

2.5 将大家组合起来

由于两个维度的解离,可以实现各种组合。

public class Main {public static void main(String[] args) {Computer computer = new DellComputer(new WindowsOperationSystem());computer.work();Computer computer2 = new DellComputer(new LinuxOperationSystem());computer2.work();Computer computer3 = new AppleComputer(new MacOperationSystem());computer3.work();}
}

运行如下

Dell 笔记本,开机启动
windows操作系统,操作系统加载
Dell 笔记本,开机启动
Linux操作系统,操作系统加载
Apple 笔记本,开机启动
Mac操作系统,操作系统加载

总结

在使用桥接模式时,首先应该识别出一个类所具有的两个独立变化的维度,将它们设计为两个独立的继承等级结构,为两个维度都提供抽象层,并建立抽象耦合。
  
模式系列在github上有一个开源项目,主要是本系列博客的demo代码。https://github.com/forestnlp/designpattern
如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。

六、桥接模式——将多重继承增加一个旁路相关推荐

  1. GOF设计模式之桥接模式

    一.引入 现需要提供能够绘制4种不同颜色且笔画粗细有大中小3种型号的画笔. 方法一:蜡笔 我们需要准备3*4=12支蜡笔,也就是说必须准备12个具体的蜡笔类 方法二:毛笔 只需要准备三种型号的毛笔,外 ...

  2. Java设计模式(四):结构性模式(适配器模式、桥接模式、装饰模式、组合模式、外观模式、亨元模式、代理模式)

    目录 一· 适配器设计模式 1.1 现实生活中的适配器例子 1.2 基本介绍 1.3 工作原理 1.4 类适配器模式 1.5 对象适配器模式 1.6 接口适配器模式 1.7 适配器模式在 Spring ...

  3. 图解Java设计模式学习笔记——结构型模式(适配器模式、桥接模式、装饰者模式、组合模式、外观模式、享元模式、代理模式)

    一.适配器模式(类适配器.对象适配器.接口适配器) 1.现实生活中的例子 泰国插座用的是两孔的(欧标),可以买个多功能转换插头(适配器),这样就可以使用了国内的电器了. 2.基本介绍 适配器模式(Ad ...

  4. 处理多维度变化——桥接模式

    本文转载自 :http://blog.csdn.net/lovelion/article/details/7464183 在正式介绍桥接模式之前,我先跟大家谈谈两种常见文具的区别,它们是毛笔和蜡笔.假 ...

  5. 小白设计模式:桥接模式

    定义 将抽象部分与实现部分分离开来,使得二者可以独立变化,互不影响的结构型设计模式. 主要组成 抽象部分(Abstraction) : 该类保持一个对实现部分的引用,抽象部分中的方法需要调用实现部分的 ...

  6. C语言和设计模式(桥接模式)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 在以往的软件开发过程中,我们总是强调模块之间要低耦合,模块本身要高内聚.那么,可以通过哪些设计 ...

  7. 第 10 章 桥接模式

    第 10 章 桥接模式 1.手机操作问题 现在对不同手机类型.不同品牌的手机实现操作编程(比如:开机.关机.上网,打电话等) 2.传统方案解决手机问题 类图 传统方案解决手机操作问题分析 扩展性问题( ...

  8. C#设计模式之桥接模式

    桥接模式 文章目录 桥接模式 模式分类 模式产生的原因 模式灵感的来源 模式类图 代码实现 桥接模式和适配器模式的联用 桥接模式的总结 桥接模式的优点: 桥接模式的缺点: 本片博客将介绍桥接模式,桥接 ...

  9. 桥接模式(Bridge Pattern)

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

最新文章

  1. push代码到github时,每次都要输入用户名和密码的问题
  2. 配置系统在开机时启动虚拟机
  3. BZOJ4855 : [Jsoi2016]轻重路径
  4. 6张脑图系统讲透python爬虫和数据分析、数据挖掘
  5. Tomcat 详解 一
  6. 顶尖机器学习学习路线,6个月让你的技术成为行业TOP5%
  7. matlab dll没有头文件,matlab调用dll没有头文件怎么办
  8. pytorch中tensor类型转换
  9. createEventObject 与 createEvent EDIT WATCH
  10. 软件设计原则(七) 迪米特法则
  11. 画画不只是为了艺考,还能成为一门手艺~
  12. 英语发音之音标2---去尾法(a和其他6个辅音字母总共7个字母发音)
  13. Python3 - DBUtils 和 pymysql 整合
  14. 如何写好一个2Take1 Lua - 搭建Lua环境
  15. RabbitMQ Applying plugin configuration to rabbit@xxx... Plugin configuration unchanged.
  16. CDN内容分发网络(上)
  17. 2017年5月5号课堂笔记
  18. 重磅!道翰天琼解密认知智能核心秘密三大核心技术,机器人大脑API平台。
  19. 职场上个人价值的三个驱动力
  20. 《能力陷阱》学习总结

热门文章

  1. 欧拉函数(详解)-数论
  2. 偏差和方差(bias and variance)
  3. 人工智能的前沿信息获取之使用谷歌学术搜索
  4. mysql 字段写入_MySQL为数据表的指定字段插入数据
  5. 打开查看linux内核代码,source insight 查看linux内核代码树【转载】
  6. 【阿里云服务器Ubuntu数据库MongoDB设置远程链接】
  7. 读书笔记之《一口气读完世界历史》
  8. 蓝桥杯2018年省赛真题--全球变暖
  9. 计算机考研复试面试常问问题 操作系统篇
  10. 《构建之法》第五次随笔