桥接模式(Bridge Pattern)就是把事物和其具体实现分开,使他们可以各自独立的变化。桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时候,在各个数据库之间进行切换,基本不需要动太多的代码,甚至丝毫不用动,原因就是JDBC提供统一接口,每个数据库提供各自的实现,用一个叫做数据库驱动的程序来桥接就行了。桥接设计模式的类图如下所示:

定义一个抽象类Abstraction,持有Implementor接口。然后接口的具体实现类ConcreteImplementA和ConcreteImplementB具体实现。

下面我们假设实现一个简单的桥接设计模式案例。类图如下所示:

(1)定义Sourceable接口

为了命名规范,我们Sourceable接口写成ISourceable;

(2)实现ISourceable接口的实现类

(3)定义Bridge抽象类

(4)absBridge抽象类的具体实现类

(5)测试类

总结:

桥接设计模式其实摆脱了继承关系体系,通过多态的方式,具体的Bridge实现类中调用父类(抽象类)中的method方法,而该抽象类通过持有接口的引用,调用接口的method方法,而接口中的method方法由具体子类实现,因此传入什么实现类,就调用哪个实现类的method方法。

桥接设计模式的优点就是类间解耦,Sourceable接口的具体实现类也可以继续扩展下去。本例中的absBridge类似于JDBC中的DriverManager,Sourceable的具体实现类就类似于MySQL、ORACLE的驱动器。

思考1:谈到桥接模式,有必要说说类的继承有什么优缺点?

其实继承的优点有很多,可以把公共的方法或属性抽取,父类封装共性,子类实现特性,这是继承的基本功能。

那么继承的缺点有吗?有,强关联关系,父类有个方法,你子类也必须有这个方法,是不可选择的,那这会带来扩展性的问题,我举个简单的例子来说明这个问题:父(Father)类有一个方法A,子(Son)类继承了这个方法,然后子子(Grandson)类也继承了这个方法,问题是突然有一天子(Son)类要重写父类的这个方法,他敢做吗?绝对不敢!子子可是要用从父类(Father)继承过来的方法A,你修改了,那就要修改Son和GrandSon之间的关系,那这个风险就大了去。

今天讲的这个桥梁模式就是这一问题的解决方法,桥梁模式描述了类间弱关联关系,还说上面的那个例子,Fater类完全可以把可能会变化的方法放出去,Son子类要有这个方法很简答,桥梁搭过去,获得这个方法,GrandSon也一样,即使你Son子类不想使用这个方法了,也没关系,对GrandSon不产生影响,它不是从你Son中继承来的方法!

java 桥梁模设计,Java设计模式学习篇(九)桥接设计模式相关推荐

  1. java 堆内存结构_JVM内存结构、Java内存模型和Java对象模型

    JVM内存结构 我们都知道,Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途.其中有些区域随着虚拟机进程的启动而存 ...

  2. java记事本课程设计,java记事本课程设计

    java记事本课程设计 一. 设计内容和要求1. 设计一个具有 GUI 界面的记事本 含有简单的文字编辑功能 如 剪切.复制.粘贴.删除 还能实现保存.另存为.设置字体和颜色等功能.2. 本程 ...

  3. java 树结构递归设计,java实现递归树形结构

    数据结构递归树,数据结构递归算法,数据结构递归,数据结构递归运算,考研数据结构考递归,数据结构递归回溯,js递归树形数据结构,数据结构分治,递归变非递归用什么数据结构...... 通过函数递归调用来实 ...

  4. Java设计模式(十五):桥接设计模式

    1. 应用场景 假如你正在为一个新的人体工学且友好的电视遥控器编程.你要使用好的OO技能,让所有的遥控器都基于相同的抽象,对此抽象又做出不同的实现-每部不同型号的电视机都有自己的遥控器的实现. 2. ...

  5. 【我的设计模式学习笔记】洞察设计模式的底层逻辑

    PS: 本文转载于:https://developer.aliyun.com/article/783549 简介 设计模式是开发同学经常聊到的话题,也经常被用到实际的开发项目中,熟练的人可以做到信手拈 ...

  6. 设计模式学习,23种设计模式详解:概述

    设计模式学习:概述 首先,别把程序设计不当设计! 程序的框架就是建筑物的骨架,内部实现不过是装修改造.只要骨架设计没有问题,装修起来也是得心应手.一个糟糕的程序框架,对于接下来的Debug和程序的更新 ...

  7. 基于java互助平台设计_学生学习交流互助社区系统的设计与实现(MySQL)

    学生学习交流互助社区系统的设计与实现(MySQL)(任务书,开题报告,中期检查表,文献综述,外文翻译,毕业论文15000字,程序代码,MySQL数据库) 学生互助社区(Help) 使用Java 编程语 ...

  8. java数据类型转换方向_java基础学习篇02(数据类型转换和基本面试题)

    JAVA基本数据类型转换 java中的数据类型,分为,引用数据类型和基本数据类型.基本数据类型有8中 整型:byte 8位 . short 16位 .int 32位 .long 64位. (8位=1个 ...

  9. java自动违例设计,java学习记录(二):java的违例控制机制

    1 产生一个违例时,首先按照与创建java对象一样的方法创建违例对象:在内存"堆"里,使用new 来创建.随后停止当前执行路径,然后从当前环境中释放违例句柄.此时,违例控制机制会接 ...

最新文章

  1. 【framework】spring3-mvc实例-信息转换
  2. 微型计算机分析,微机原理练习题分析
  3. Appium 常见API 四(三种等待方式)
  4. Mac中搭建Kubernetes
  5. python choice添加下拉框_自定义Django Form中choicefield下拉菜单选取数据库内容实例...
  6. toast弹窗_Android 开发(一):Toast弹窗与获取控件的值
  7. postgresql 数据库
  8. 微信官方回应iOS 13.2频繁杀后台问题:建议先不升级
  9. STM32工作笔记0052---串口通信原理--UART
  10. python读取dat文件并保存为Excel格式
  11. COMSOL案例内容,有需要的了解下!
  12. 编程机器人考级证书有用吗_机器人编程有等级考试吗?
  13. 《OpenGL编程指南(原书第9版)》——第3章 3.0OpenGL绘制方式
  14. (一)市场调查大赛系列——市场调查研究选题
  15. Python实现逆Radon变换——直接反投影和滤波反投影
  16. 卸载360天擎-奇安信
  17. DataGrip 连接MySQL 找不到需要的schemas
  18. PDA手持终端扫描条码开单打印一体 结合后台电脑系统 数据同步交互解决方案
  19. Keil_uvision_4基本使用教程
  20. 计算机系统基础实验——数据的机器级表示

热门文章

  1. FFmpeg 源代码:avcodec_find_encoder()和avcodec_find_encoder_by_name()
  2. 网易视频云:分布式转码服务高可用浅析
  3. STL:transform
  4. centos7 升级curl版本
  5. Gitlab 10.1.4 (汉化版) for CentOS 7.4安装
  6. go 分段锁ConcurrentMap,map+读写锁,sync.map的效率测试
  7. 异常处理——上传文件到HDFS,put: `.': No such file or directory
  8. Redis实战(二):Redis 的 String 类型 bitmap
  9. java中wait和sleep的区别
  10. PAT甲级 -- 1005 Spell It Right (20 分)