第 10 章 桥接模式

1、手机操作问题

现在对不同手机类型、不同品牌的手机实现操作编程(比如:开机、关机、上网,打电话等)

2、传统方案解决手机问题

类图


传统方案解决手机操作问题分析

  1. 扩展性问题(类爆炸), 如果我们再增加手机的样式(旋转式),就需要增加各个品牌手机的类,同样如果我们增加一个手机品牌,也要在各个手机样式类下增加
  2. 违反了单一职责原则,当我们增加手机样式时,要同时增加所有品牌的手机,这样增加了代码维护成本
  3. 解决方案 --> 使用桥接模式

3、桥接模式基本介绍

桥接模式(Bridge)-基本介绍

  1. 桥接模式(Bridge模式)是指:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变,桥接模式是一种结构型设计模式
  2. Bridge模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展

4、桥接模式原理类图

桥接模式(Bridge)-原理类图

  1. Client:桥接模式的调用者
  2. Abstraction:抽象类,Abstraction 中维护了一个 Implementor 实现类的实例(聚合关系),Abstraction 充当桥接类
  3. RefinedAbstractionAbstraction 的具体实现类
  4. Implementor:定义行为的接口
  5. ConcreteImplementorImplementor 的具体实现类

UML 图: 这里的抽象类和接口是聚合的关系, 其实也是调用和被调用关系,抽象在 Abstraction 这一块,行为实现在 Implementor 这一块

5、桥接模式解决手机问题

使用桥接模式改进传统方式,让程序具有更好的扩展性,利用程序维护


类图


代码实现

  1. Brand:规定各个品牌手机的行为

    //接口
    public interface Brand {void open();void close();void call();
    }
    
  2. XiaoMi:实现了 Brand 接口,指定了小米手机的具体行为

    public class XiaoMi implements Brand {@Overridepublic void open() {System.out.println(" 小米手机开机 ");}@Overridepublic void close() {System.out.println(" 小米手机关机 ");}@Overridepublic void call() {System.out.println(" 小米手机打电话 ");}}
    
  3. Vivo:实现了 Brand 接口,指定了 Vivo 手机的具体行为

    public class Vivo implements Brand {@Overridepublic void open() {System.out.println(" Vivo手机开机 ");}@Overridepublic void close() {System.out.println(" Vivo手机关机 ");}@Overridepublic void call() {System.out.println(" Vivo手机打电话 ");}}
    
  4. Phone:电话的抽象类,在该类中聚合了一个 Brand 接口的具体实现类

    public abstract class Phone {// 组合品牌private Brand brand;// 构造器public Phone(Brand brand) {this.brand = brand;}protected void open() {this.brand.open();}protected void close() {this.brand.close();}protected void call() {this.brand.call();}}
    
  5. FoldedPhone:继承抽象父类 Phone,对抽象父类中的方法进行重写

    //折叠式手机类,继承 抽象类 Phone
    public class FoldedPhone extends Phone {// 构造器public FoldedPhone(Brand brand) {super(brand);}@Overridepublic void open() {super.open();System.out.println(" 折叠样式手机 ");}@Overridepublic void close() {super.close();System.out.println(" 折叠样式手机 ");}@Overridepublic void call() {super.call();System.out.println(" 折叠样式手机 ");}}
    
  6. UpRightPhone:继承抽象父类 Phone,对抽象父类中的方法进行重写

    public class UpRightPhone extends Phone {// 构造器public UpRightPhone(Brand brand) {super(brand);}@Overridepublic void open() {super.open();System.out.println(" 直立样式手机 ");}@Overridepublic void close() {super.close();System.out.println(" 直立样式手机 ");}@Overridepublic void call() {super.call();System.out.println(" 直立样式手机 ");}}
    
  7. Client:客户端,可以看到,使用桥接模式可以轻松地组合出不同手机类型、不同品牌的手机

    public class Client {public static void main(String[] args) {// 折叠式的小米手机 (样式 + 品牌 )Phone phone1 = new FoldedPhone(new XiaoMi());phone1.open();phone1.call();phone1.close();System.out.println("=======================");// 折叠式的Vivo手机 (样式 + 品牌 )Phone phone2 = new FoldedPhone(new Vivo());phone2.open();phone2.call();phone2.close();System.out.println("==============");// 直立式的小米手机 (样式 + 品牌 )UpRightPhone phone3 = new UpRightPhone(new XiaoMi());phone3.open();phone3.call();phone3.close();System.out.println("==============");// 直立式的Vivo手机 (样式 + 品牌 )UpRightPhone phone4 = new UpRightPhone(new Vivo());phone4.open();phone4.call();phone4.close();}}
    

总结

  1. Phone 就像一座桥的感觉,它其实并没有做什么实质性的工作,只是调用 Brand 的具体实现类中的方法,就感觉像是一个请求从 Phone 的具体实现类通过 Phone 传递到了 Brand 的具体实现类
  2. 通过代码我们可以看到,增加一个新的手机样式,并不会引起类膨胀,因为只要新样式继承了 Phone,并通过构造器或者 setter 方法聚合一个 Brand 实现类的实例,就能完成组合的作用

6、JDBC 源码剖析

桥接模式在JDBC的源码剖析

JdbcDriver接口,如果从桥接模式来看, Driver就是一个接口(行为规范),下面可以有MySQLDriverOracleDriver,这些就可以当做实现接口类

源码剖析

类图


代码追踪

  1. 客户端通过 DriverManager 操作数据库,DriverManager 里面定义了很多方法,就比如说如下的 getConnection() 方法,它返回一个 Connection 对象

    @CallerSensitive
    public static Connection getConnection(String url,java.util.Properties info) throws SQLException {return (getConnection(url, info, Reflection.getCallerClass()));
    }
    
  2. Connectionjava.sql 包下的接口,里面定义了 超多的抽象方法,比如 prepareStatement() 方法

    public interface Connection  extends Wrapper, AutoCloseable {// ...  PreparedStatement prepareStatement(String sql, int resultSetType,int resultSetConcurrency, int resultSetHoldability)throws SQLException;CallableStatement prepareCall(String sql, int resultSetType,int resultSetConcurrency,int resultSetHoldability) throws SQLException;PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)throws SQLException;PreparedStatement prepareStatement(String sql, int columnIndexes[])throws SQLException;PreparedStatement prepareStatement(String sql, String columnNames[])throws SQLException;// ...
    
  3. com.mysql.jdbc.Connection 接口继承了 java.sql.Connection 接口

    public interface Connection extends java.sql.Connection, ConnectionProperties {
  4. ConnectionImpl 类实现了 MySQLConnection 接口,其中 MySQLConnection 接口继承了 com.mysql.jdbc.Connection 接口

    public class ConnectionImpl extends ConnectionPropertiesImpl implements MySQLConnection {

总结

就以 getConnection() 方法的调用过程为例,Client 端调用 DriverManager(桥接器),DriverManager 去找 java.sql.Connection 的具体实现类

7、桥接模式的注意事项

桥接模式的注意事项和细节

  1. 实现了抽象和实现部分的分离, 从而极大的提供了系统的灵活性, 让抽象部分和实现部分独立开来, 这有助于系统进行分层设计, 从而产生更好的结构化系统。
  2. 对于系统的高层部分, 只需要知道抽象部分和实现部分的接口就可以了, 其它的部分由具体业务来完成。
  3. 桥接模式替代多层继承方案, 可以减少子类的个数, 降低系统的管理和维护成本
  4. 桥接模式的引入增加了系统的理解和设计难度, 由于聚合关联关系建立在抽象层, 要求开发者针对抽象进行设计和编程
  5. 桥接模式要求正确识别出系统中两个独立变化的维度(抽象和实现), 因此其使用范围有一定的局限性, 即需要有这样的应用场景

8、桥接模式应用场景

对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统, 桥接模式尤为适用

  1. JDBC 驱动程序
  2. 银行转账系统
    1. 转账分类(抽象层):网上转账, 柜台转账, AMT 转账
    2. 转账用户类型(行为实现): 普通用户, 银卡用户, 金卡用户
  3. 消息管理
    1. 消息类型(抽象层): 即时消息, 延时消息
    2. 消息分类(行为实现): 手机短信, 邮件消息, QQ 消息

第 10 章 桥接模式相关推荐

  1. 设计模式C++实现(10)——桥接模式

    软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累.最 ...

  2. 第 10 章 建造者模式【Builder Pattern】

    以下内容出自:<<24种设计模式介绍与6大设计原则>> 又是一个周三,快要下班了,老大突然又拉住我,喜滋滋的告诉我"牛叉公司很满意我们做的模型,又签订了一个合同,把奔 ...

  3. 第10章 组合模式(Composite Pattern)

    组合模式(Composite Pattern) --.NET设计模式系列之十一 Terrylee,2006年3月 概述 组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复 ...

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

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

  5. 设计模式学习笔记(十五)-桥接模式

    处理多维度变化 在正式介绍桥接模式之前,我先跟大家谈谈两种常见文具的区别,它们是毛笔和蜡笔.假如我们需要大中小3种型号的画笔,能够绘制12种不同的颜色,如果使用蜡笔,需要准备3×12 = 36支,但如 ...

  6. vmware虚拟机 配置动态 静态 固态IP 三种模式: 桥接模式 nat模式和仅主机模式 Host-only模式

    目录 目录 一. 安装了图形化桌面操作系统时 一.桥接模式 二.nat模式 三.host-only模式 二.没有桌面操作系统时(centos 7) 1.Bridged模式(桥接模式) 2.Nat模式( ...

  7. Bridge 桥接模式

    定义 桥接模式是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦. 这种模式涉及到一个作为桥接的接口,使得实体 ...

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

    如何让孩子爱上设计模式 --10.桥接模式(Bridge Pattern) 标签: 设计模式初涉 我有故事,你有酒吗?这年头写个技术文不讲个故事都不行,行,我讲: 还有发现很多的技术博文都开始有喜欢往 ...

  9. linux桥接设置静态,centos6.10 桥接模式下配置静态ip

    centos6.10 桥接模式下配置静态ip主要是修改以下三个地方: /etc/sysconfig/network-scripts/ifcfg-eth0(这个文件名版本不同文件名也不同,可以先cd / ...

最新文章

  1. 不仅仅是写代码,而是完成作品
  2. java 分配cpu使用率_Java-JVM-CPU使用率达到100%
  3. 深入Java泛型(三):泛型的上下边界
  4. CentOS7下zip解压和unzip压缩文件
  5. 会声会影转换成html,HTML5视频制作会声会影就能做?
  6. Python并发编程:多线程-死锁现象与递归锁
  7. undertale人物_「undertale」传说之下精美人物图包 (SansGaster篇)
  8. 《Head First设计模式》第九章(2)组合模式
  9. 深度学习编译:MLIR初步
  10. 第一个Scala程序——Hello World!
  11. mysql定时发送慢日志到邮件
  12. 疑似realme旗舰新机入网:采用升降前置摄像头
  13. Spark Structured : KuduException$OriginalException: Originalasynchronous stack trace
  14. 2013国家二级c语言上机考试点了编译并运行出现黑框闪退,2013年计算机二级C语言上机试题及解析2...
  15. 服务器如何自动校准北京时间,北京时间
  16. win10重置系统后右键一直转圈,解决鼠标右键一直转圈问题
  17. 四级英语图表作文真题计算机,英语四级作文真题
  18. 小学生html教程,小学.html
  19. 裁员潮,带给我的思考
  20. ACAD DWG to PDF Converter 9.8.2.4版本更新啦

热门文章

  1. 2021-2025年中国超细氢氧化铝行业市场供需与战略研究报告
  2. linux c中字符替换函数,Linux C 支持正则表达式的字符串替换函数
  3. 这位硬核程序员,想好怎么过春节了吗?
  4. 函数计算如何粘合云服务,提供端到端解决方案
  5. 马化腾首次回应反垄断;乔布斯 1973 年求职申请表被拍出22.24万美元;英特尔新CEO表示很乐意为苹果代工 | 极客头条...
  6. 是!“不会数据分析的,全是假程序员”!HR:太真实……
  7. 达摩院自研数学规划求解器发布,最新技术将通过阿里云对外输出
  8. 程序员必修课:为什么非要用 Python 做数据分析?Excel 不好吗?
  9. 国产 14nm 迎曙光,进口荷兰光刻机顺利入厂!
  10. 作为程序员的我春节还没抢到票却抢到这玩意儿,也是值了!