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. 数据可视化实例(三): 散点图(pandas,matplotlib,numpy)

    关联 (Correlation) 关联图表用于可视化2个或更多变量之间的关系. 也就是说,一个变量如何相对于另一个变化. 散点图(Scatter plot) 散点图是用于研究两个变量之间关系的经典的和 ...

  2. CMDB03 /今日未采集的资产、资产入库、资产变更记录、资产采集

    CMDB03 /今日未采集的资产.资产入库.资产变更记录.资产采集 目录 CMDB03 /今日未采集的资产.资产入库.资产变更记录.资产采集 1. 获取今日未采集的服务器 2. server资产入库以 ...

  3. mysql语句批量产生大量测试数据

    CREATE TABLE `t_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, ` ...

  4. POJ 1057 File Mapping 最详细的解题报告

    题目来源:POJ 1057 File Mapping 题目大意:像我的电脑那样显示文件夹和文件信息,其中在同一级目录内,文件夹排在文件的前面并且文件夹的顺序不变,同一级目录中文件按字母序排列.文件以‘ ...

  5. LeetCode第4题:寻找两个有序数组的中位数

    double Solution::findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) ...

  6. Unity- 小“东西”

    菜单栏遍历处理预制体工具 public class GameEditor : Editor { private static void ProcessPrefabs(Action<GameObj ...

  7. 【DevCloud·敏捷智库】如何利用用户故事了解需求

    摘要:这篇文章主要解决因为不能很好地理解需求而估算做不好的问题,在这里可以了解下如何利用用户故事了解需求. 背景 很多团队在应用敏捷开发时,对估算经常感到困惑.这里所说的估算是指产品列表条目(PBI, ...

  8. two types of friend

    两类朋友 第一类,普通朋友,并不能分享一些隐私的感情,只能说一些事情,有一些只是认识的人或者虽然认识很多年但是也只能是这样的! 第二类,关心你,可以交流感清,明显更加亲密一点. 不要对第一类朋友说第二 ...

  9. 服务端socket重用属性设置

    初始化socket socket是一种系统资源,并不是每次初始化都一定成功,因此为了避免初始化失败,一般使用多次初始化的方式,如下所示: unsigned int times = 0x0; while ...

  10. 高效C++:构造/析构/赋值

    了解C++默认提供和调用的函数 编译器会自动为每一个空类创建构造函数.拷贝构造函数.赋值运算符以及析构函数 不要使用编译器自动创建的函数,要杜绝这种情况发生,自己编写这些函数 如果不想使用编译器自动生 ...