1、何为桥接模式

桥接模式是一种将类的功能层次和实现层次分离的技术,所谓类的功能层次指的是类要实现什么功能,要定义多少个函数还进行处理,在功能之中我们会用到继承来定义新的方法同时也能使用父类的方法,这样就构成了一个层次“父类-子类-孙类...”,这就是功能层次,与之对应的就是实现层次了,其实也很好理解,如果我们事先确定了完成一件事情的最基本的子功能,那么我们定义这些子功能为接口或者抽象类,然后使用实现类来进行实现,这样一个抽象类,多个实现类,(抽象类——>(实现类1,实现类2,实现类...))这样的结构就是实现层次,可以看到高度一直为2,而功能层次高度为N(N为继承的层次)。

那么可不可以将这两者分离呢,一方面我们知道一个类的基础子功能并且能够使用到这些子功能的实现,另一方面我们可以在这些子功能的基础上定义出我们自己需要的功能(功能层次),如果可以的话,基本的元素就相当于空气、水分等元素,而我们需要的功能就是将这些东西组成一种种不同的物质。这里就用到了委托,或者说是组合。实现了功能层次和实现层次分离的结构,我们称之为桥接模式。

Bridge 中午意译为 桥梁

2、示例

类图:

定义Printer接口类

package cn.design.structured.bridge;

/**
* @author lin
* @version 1.0
* @date 2020-07-21 14:34
* @Description TODO
*/
public interface Printer {
   void open();    void print();    void close(); }

定义PrinterImpl实现类

package cn.design.structured.bridge;

/**
* @author lin
* @version 1.0
* @date 2020-07-21 14:35
* @Description TODO
*/
public class PrinterImpl implements Printer {
   String string;
   int width;    public PrinterImpl(String string) {
       this.string = string;
       this.width = string.length();
  }    @Override
   public void open() {
       printLine();
  }    @Override
   public void print() {
       System.out.println("|" + string + "|");
  }    @Override
   public void close() {
       printLine();
  }    private void printLine() {
       System.out.print("+");
       for (int i = 0; i < width; i++) {
           System.out.print("-");
      }
       System.out.println("+");
  } }

定义Display类

package cn.design.structured.bridge;

/**
* @author lin
* @version 1.0
* @date 2020-07-21 14:39
* @Description TODO
*/
public class Display {
   Printer printer;    public Display(Printer printer) {
       this.printer = printer;
  }
   public void display(){
       printer.open();
       printer.print();
       printer.close();
  } }

定义CountDisplay继承类

package cn.design.structured.bridge;

/**
* @author lin
* @version 1.0
* @date 2020-07-21 14:40
* @Description TODO
*/
public class CountDisplay extends Display {
   int count;    public CountDisplay(Printer printer, int count) {
       super(printer);
       this.count = count;
  }    public void multiDisplay() {
       printer.open();
       for (int i = 0; i < count; i++) {
           printer.print();
      }
       printer.close();
  } }

定义BridgeMain测试类

package cn.design.structured.bridge;

/**
* @author lin
* @version 1.0
* @date 2020-07-21 14:42
* @Description TODO
*/
public class BridgeMain {
  public static void main(String[] args) {
      Display d1 = new Display(new PrinterImpl("Hello World"));
      d1.display();
      CountDisplay c1 = new CountDisplay(new PrinterImpl("Hello FaGeJiang !"), 3);
      c1.display();
      c1.multiDisplay();
  }
}

运行结果如下:

+-----------+
|Hello World|
+-----------+
+-----------------+
|Hello FaGeJiang !|
+-----------------+
+-----------------+
|Hello FaGeJiang !|
|Hello FaGeJiang !|
|Hello FaGeJiang !|
+-----------------+

3、登场角色分析

类图:

Abstraction(抽象化)

该角色位于“类的功能层次的结构”的最上层。它使用Implementor角色的方法定义了基本的功能。该角色中保存了Implementor角色的实例。在示例程序中,由Display类扮演此角色。

RefinedAbstraction(改善后的抽象化)

在Abstraction角色的基础上增加了新功能的角色。在示例程序中,由CountDisplay类扮演此角色。

Implementor(实现者)

该角色位于“类的实现层次结构”的最上层。它定义了用于实现Abstraction角色的接口(API)的方法。在示例程序中,由DisplayImpl类扮演此角色。

ConcreteImplementor(具体实现者)

该角色负责实现在Implementor角色中定义的接口(API)。在示例程序中,由StringDisplayImpl类扮演此角色。

“类的功能层次结构”和“类的实现层次结构”之间的桥梁就是Abstraction角色中的impl字段。

4、小结

桥梁模式的用意是"将抽象化(Abstraction)与实现化([Implementation]脱耦],使得二者可以独立地变化"。这句话有三个关键词,也就是抽象化、实现化和脱耦。

抽象化

存在于多个实体中的共同的概念性联系,就是抽象化。作为一个过程,抽象化就是忽略一些信息,从而把不同的实体当做同样的实体对待。

实现化

抽象化给出的具体实现,就是实现化。

脱耦

所谓耦合脱耦是指将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联。

将两个角色之间的继承关系改为[聚合关系],就是将它们之间的强关联改换成为弱关联。因此,[桥梁模式]中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以相对独立地变化。这就是桥梁模式的用意。

发哥讲

如果你觉得文章还不错,就请点击右上角选择发送给朋友或者转发到朋友圈~  转载 需备注 来源以及链接

● 扫码关注公众号  发哥讲 

9、Bridge 桥梁模式 将类的功能层次结构与实现层结构分离 结构型设计模式的更多相关文章

  1. 桥接模式 桥梁模式 bridge 结构型 设计模式(十二)

      桥接模式Bridge   Bridge 意为桥梁,桥接模式的作用就像桥梁一样,用于把两件事物连接起来   意图 将抽象部分与他的实现部分进行分离,使得他们都可以独立的发展.  意图解析 依赖倒置原 ...

  2. Bridge 桥梁模式

    注:桥梁模式是结构型设计模式,将抽象部分与它的实现部分相分离,使他们可以独立的变化.  抽象部分可能有n种实现,而实现部分可能有n种实现方式,采用享元模式,减少子类数据. 曾经看过一个桥梁模式相关的例 ...

  3. 代理模式 PROXY Surrogate 结构型 设计模式(十四)

    代理模式 PROXY 别名Surrogate 意图 为其他的对象提供一种代理以控制对这个对象的访问. 代理模式含义比较清晰,就是中间人,中介公司,经纪人... 在计算机程序中,代理就表示一个客户端不想 ...

  4. 享元模式 FlyWeight 结构型 设计模式(十五)

    享元模式(FlyWeight)  “享”取“共享”之意,“元”取“单元”之意. 意图 运用共享技术,有效的支持大量细粒度的对象. 意图解析 面向对象的程序设计中,一切皆是对象,这也就意味着系统的运行将 ...

  5. 组合模式 合成模式 COMPOSITE 结构型 设计模式(十一)

    组合模式(合成模式 COMPOSITE) 意图 将对象组合成树形结构以表示“部分-整体”的层次结构. Composite使得用户对单个对象和组合对象的使用具有一致性.   树形结构介绍 为了便于理解, ...

  6. 设计模式C++学习笔记之十一(Bridge桥梁模式)

      桥梁模式,将抽象部分与它的实现部分分离,使它们都可以独立地变化.实现分离的办法就是增加一个类, 11.1.解释 main(),客户 IProduct,产品接口 CHouse,房子 CIPod,ip ...

  7. 装饰器模式 Decorator 结构型 设计模式 (十)

    引子           现实世界的装饰器模式 大家应该都吃过手抓饼,本文装饰器模式以手抓饼为模型展开简介 "老板,来一个手抓饼,  加个培根,  加个鸡蛋,多少钱?" 这句话会不 ...

  8. 12、Decorator 装饰器 模式 装饰起来美美哒 结构型设计模式

    1.Decorator模式 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式(Decorator Pattern)允许向一个现 ...

  9. 11、Composite 组合模式 容器与内容的一致性(抽象化) 结构型设计模式

    1.Composite模式定义 组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这 ...

随机推荐

  1. 数据可视化之powerBI基础(三)编辑交互,体验更灵活的PowerBI可视化

    https://zhuanlan.zhihu.com/p/64412190 PowerBI可视化与传统图表的一大区别,就是可视化分析是动态的,通过页面上筛选.钻取.突出显示等交互功能,可以快速进行访问 ...

  2. 那些非cmake生成的VTK工程存在的让人崩溃的坑

    由于cmake和IDE的一些编译选项不同,所以导致我们使用者需要多做一些事情.而且vtk官方也表示: If you are not using CMake to compile your code, ...

  3. 问题:win10缺少一个或多个网络协议

    国庆回家,家里电脑连不上网了,诊断给出的结果是“缺少一个或多个网络协议” 网上这类问题提问的不少,回答的方法也是各种各样,一个一个试下来,发现这个方法是可行的. 1.打开设置--网络和Internet ...

  4. Go Pentester - HTTP CLIENTS(3)

    Interacting with Metasploit Early-stage Preparation: Setting up your environment - start the Metaspl ...

  5. 微信小程序反编译~2020年

    目录 摘要 介绍 安装反编译脚本 使用 获取wxapkg文件 反编译 结论 参考资料 摘要 安装wxappUnpacker小程序反编译工具并使用(2020.03) 关键词: 微信小程序反编译 wxss ...

  6. 设计模式:interpreter模式

    理解:可以广义的理解为创造一种语言,实现该语言的解释器,然后用创造的语言编写程序 对比:如xml就是一种语言,解析xml的代码就是解释器 例子: //目标:定义4中几种命令,使用C++解析 //如下: ...

  7. Azure Traffic Manager(二) 基于权重与基于优先级的路由策略为我们的Web项目提供负载均衡

    一,引言 上一片文章我们使用 Azure Traffic Manager 分发用户请求,同时演示了两种路由策略,“Performance”,“Geographic”的两种方式,今天我们继续讲解 Tra ...

  8. tomcat 认证爆破之custom iterator使用

    众所周知,BurpSuite是渗透测试最基本的工具,也可是神器,该神器有非常之多的模块:反正,每次翻看大佬们使用其的骚操作感到惊叹,这次我用其爆破模块的迭代器模式来练练手[不喜勿喷] 借助vulhub ...

  9. Oracle连接报错之IO异常(The Network Adapter could not establish the connection)

    简单介绍:自己封装oracle jdbc的一些常用功能jar包,自己本机玩没啥问题,给别人玩儿,发现总是抛异常 IO异常(The Network Adapter could not establish ...

  10. MySQL之高级操作

     新增数据: 基本语法: insert into 表名 [(字段列表)] values(列表值) 在数据插入的时候,假设主键对应的值已经存在,插入一定会失败 主键冲突: 当主键存在冲突的时候(Dupl ...