Bridge模式,又叫桥接模式,是针对同一接口进行扩展与实现操作的一种设计模式。

这种模式,与之前学过的适配器模式具有相似的地方,也有不同的地方,下面就让我们一一解析吧。

首先,我们要了解到,为什么需要使用Bridge模式:

现在有一个抽象类/接口,这个抽象类是起到了一个规范的作用,规范一些方法。

示例是用来在控制台中打印输出框和字符串(规范输出)

  • DisplayImpl 抽象类,规范了打印的方法
  1. package site.wangxin520.gof.bridge;
  2.  
  3. /**
  4. * 原先需要实现/继承的类/接口
  5. * @author wangXgnaw
  6. *
  7. */
  8. public abstract class DisplayImpl {
  9.  
  10. //打开输出框
  11. public abstract void rawOpen();
  12. //在输出框里面打印字符串
  13. public abstract void rawPrint();
  14. //当打印字符串结束后,关闭输出框
  15. public abstract void rawClose();
  16.  
  17. }

在此抽象类/当然也可以使用接口中,规定了三个抽象方法,让子类去实现具体的逻辑。

  • StringDisplayImpl类,这个类是用来实现DisplayImpl中的抽象方法逻辑的。
  1. package site.wangxin520.gof.bridge;
  2.  
  3. /**
  4. * 继承了根类,并且重写了/实现了根类中定义的方法
  5. * @author wangXgnaw
  6. *
  7. */
  8. public class StringDisplayImpl extends DisplayImpl{
  9.  
  10. private String string;
  11. private int width;
  12.  
  13. /**
  14. * 构造方法,传入需要规范/美化的字符串
  15. * @param string 需要字符串
  16. */
  17. public StringDisplayImpl(String string) {
  18. this.string=string;
  19. this.width=string.length();
  20. }
  21.  
  22. /**
  23. * 实现父类的抽象方法,下同
  24. */
  25. @Override
  26. public void rawOpen() {
  27. System.out.print("+");
  28. for (int i = 0; i < width; i++) {
  29. System.out.print("-");
  30. }
  31. System.out.println("+");
  32. }
  33.  
  34. @Override
  35. public void rawPrint() {
  36.  
  37. System.out.println("|"+string+"|");
  38.  
  39. }
  40.  
  41. @Override
  42. public void rawClose() {
  43. System.out.print("+");
  44. for (int i = 0; i < width; i++) {
  45. System.out.print("-");
  46. }
  47. System.out.println("+");
  48. System.out.println("*************************");
  49. }
  50. }

在这个子类中,重写了父类中规定的抽象方法。根据面向对象的程序开发原则可知:

代码对扩展开放,但对于修改闭源。

所以,我们想要扩展功能的话,都是利用继承父类,然后在子类里面去新建方法的这种模式,但这里就得注意了,我们刚开始是实现了抽象类/接口,而规定接口/抽象类就是为了去有不同的实现逻辑,而如果再去扩展的话,就只是针对某一逻辑进行扩展,如果去扩展其他实现逻辑的话,就只能采用再去重写父类的抽象方法,再去继承来扩展。

因此,我们想到的是吧抽象类或者接口的具体实现和扩展分开来以达到扩展功能不影响实现,增加实现又不影响扩展的功能,这样就大大的简化了我们的开发。这种思想就是桥接的思想,也就是使用了bridge模式。

桥接模式和适配器模式的区别也就在此:

  1. 首先是两者的目的不同,桥接是为了分离接口的功能扩展和抽象方法的实现,而适配器模式是为了对同一实现提供不同接口。
  2. 其次是二者的实现方式不同,桥接是利用新接口去继承原先的旧接口,以此来提供新的接口给新的实现类,而桥接并不是为了改变接口,而是去为原来的接口增加功能。

下面就是具体的代码实现bridge模式:

  • Display 在这个类里面,准备一个DisplayImpl抽象类的对象作为属性(利用多态,可以不用关注具体是抽象方法的哪种实现)。
  1. package site.wangxin520.gof.bridge;
  2.  
  3. /**
  4. * 桥接用,实现功能的类
  5. * @author wangXgnaw
  6. *
  7. */
  8. public class Display {
  9.  
  10. /**
  11. * 准备一个属性,并且在构造Display类的时候将具体实现接口的类进行传入
  12. */
  13. private DisplayImpl impl;
  14. public Display(DisplayImpl impl){
  15. this.impl=impl;
  16. }
  17.  
  18. /**
  19. * 扩展了原抽象方法的方法,这里就类似于适配器模式
  20. */
  21. public void open(){
  22. impl.rawOpen();
  23. }
  24. public void print(){
  25. impl.rawPrint();
  26. }
  27. public void close(){
  28. impl.rawClose();
  29. }
  30.  
  31. /**
  32. * 扩展了display方法
  33. */
  34. public final void display(){
  35. open();
  36. print();
  37. close();
  38. }
  39.  
  40. }
  • CountDisplay,扩展父类的方法
  1. package site.wangxin520.gof.bridge;
  2.  
  3. /**
  4. * 继承了Display类,继续扩展方法
  5. * @author wangXgnaw
  6. *
  7. */
  8. public class CountDisplay extends Display{
  9.  
  10. /**
  11. * 利用构造,传参,与父类相同
  12. * @param impl
  13. */
  14. public CountDisplay(DisplayImpl impl) {
  15. super(impl);
  16. }
  17.  
  18. /**
  19. * 继续扩展了父类的方法
  20. * @param times
  21. */
  22. public void multiDisplay(int times){
  23. open();
  24. for (int i = 0; i < times; i++) {
  25. print();
  26. }
  27. close();
  28. }
  29.  
  30. }
  • 测试类:
  1. package site.wangxin520.gof.bridge;
  2.  
  3. /**
  4. * 桥接模式的测试类
  5. * @author wangXgnaw
  6. *
  7. */
  8. public class Test {
  9.  
  10. public static void main(String[] args) {
  11. //d1和d2都是使用了默认的display方法
  12. Display d1=new Display(new StringDisplayImpl("Hello world"));
  13. d1.display();
  14. Display d2=new CountDisplay(new StringDisplayImpl("Hello mars"));
  15. d2.display();
  16.  
  17. //d3使用的是扩展出来的multiDisplay方法,因为父类是不能找到子类的专属方法,所以这里没有采用多态的方式
  18. CountDisplay d3=new CountDisplay(new StringDisplayImpl("Hello moon"));
  19. d3.display();
  20. d3.multiDisplay(3);
  21.  
  22. }
  23.  
  24. }
  • 结果

可见,最后d3扩展出来的multiDisplay是可以展示的。

设计模式之——bridge模式的更多相关文章

  1. 【设计模式】Bridge模式(桥接模式)

    最近的一次面试中,被问到桥接模式,以前呢并没有很仔细的研究过这个设计模式,借此机会剖析一下. 先给出自己对这个模式理解后的源码: interface A{ void methodA(); } inte ...

  2. Java设计模式---桥接Bridge模式

    参考于 : 大话设计模式 马士兵设计模式视频 写在开头: 桥接模式主要用于一件事物分成了两个维度,进行排列组合,比如礼物,可以分成优雅的礼物(抽象),花(具体),排列组合优雅的花! 1.为什么使用桥接 ...

  3. 设计模式--桥接(Bridge)模式

    1.概述: 桥接模式:把抽象和行为分离开来,中间需要某个介质来连接抽象化和行为化.此模式的概述听起来非常像适配器模式,不要搞混了,虽然都是借用中间介质,但意义不同.最典型的桥接模式就是:JDBC.通过 ...

  4. 设计模式:bridge模式

    目的:将“类的功能层次结构”和“类的实现层次结构”分类 类的功能层次:通过类的继承添加功能(添加普通函数) 类的实现层次:通过类的继承实现虚函数 理解:和适配器模式中的桥接方法相同 例子: class ...

  5. java面试题之----jdbc中使用的设计模式(桥接模式)

    1.JDBC(JavaDatabase Connectivity) JDBC是以统一方式访问数据库的API. 它提供了独立于平台的数据库访问,也就是说,有了JDBC API,我们就不必为访问Oracl ...

  6. [设计模式] 7 桥接模式 bridge

    #include<iostream> using namespace std; class AbstractionImp { public: virtual ~AbstractionImp ...

  7. 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)

    原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...

  8. C#设计模式之八桥接模式(Bridge)【结构型】

    一.引言 今天我们要讲[结构型]设计模式的第二个模式,该模式是[桥接模式],也有叫[桥模式]的.大家第一次看到这个名称会想到什么呢?我第一次看到这个模式根据名称猜肯定是连接什么东西的.因为桥在我们现实 ...

  9. C#设计模式之七桥接模式(Bridge Pattern)【结构型】

    一.引言 今天我们要讲[结构型]设计模式的第二个模式,该模式是[桥接模式],也有叫[桥模式]的,英文名称:Bridge Pattern.大家第一次看到这个名称会想到什么呢?我第一次看到这个模式根据名称 ...

随机推荐

  1. [转]linux用户管理

    Linux 系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统.用户的账号一方面可以帮助系统管理员对使用系统的用户进行 ...

  2. 时间序列异常检测算法S-H-ESD

    1. 基于统计的异常检测 Grubbs' Test Grubbs' Test为一种假设检验的方法,常被用来检验服从正太分布的单变量数据集(univariate data set)\(Y\) 中的单个异 ...

  3. Linux Shell 运算符

    Shell 和其他编程语言一样,支持多种运算符,包括: 算数运算符 关系运算符 布尔运算符 逻辑运算符 字符串运算符 文件测试运算符 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 ...

  4. aiohttp文档翻译-server(一)

    web server 快速入门 运行一个简单的web server 为了实现web server, 首先需要实现request handler 一个 request handler 必须是一个coro ...

  5. 如何在phpstorm中查看yaf框架源码

    1.到github下载yaf框架的doc 下载链接 https://github.com/elad-yosifon/php-yaf-doc/archive/master.zip 2.解压zip包 3. ...

  6. Mac笔记本中是用Idea开发工具在Java项目中调用python脚本遇到的环境变量问题解决

    问题描述: mac笔记本本身会自带几个python版本,比如python2.7版本,我没有改动mac默认的python版本,只是安装了python3.7版本. 使用Pycharm开发Python项目没 ...

  7. MySQL数据库的安装教程及相关问题

    MySQL数据库的安装教程及相关问题 2018-07-13 MySQL数据库的下载及安装教程 问题1:Authentication plugin 'caching_sha2_password' can ...

  8. idea 下 encodings.xml 的正确位置

    在多个module存在的情况下 encodings.xml在 project 下的.idea 下面         这个就是最父级project

  9. 基于jQuery发展历程时间轴特效代码

    分享一款基于jQuery发展历程时间轴特效代码,带左右箭头,数字时间轴选项卡切换特效下载.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div id="time ...

  10. opcache分享

    opcache的技术分享ppt,独家唯一经过自己实验的分享 https://pan.baidu.com/s/1-73-QHOSeet7tcR81gto6Q