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

1、何为桥接模式

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

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

Bridge 中午意译为 桥梁

2、示例

类图:

image-20200721145525382

定义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、登场角色分析

类图:

image-20200721145924263

Abstraction(抽象化)

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

RefinedAbstraction(改善后的抽象化)

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

Implementor(实现者)

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

ConcreteImplementor(具体实现者)

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

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

4、小结

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

抽象化

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

实现化

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

脱耦

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

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

公众号发哥讲

这是一个稍偏基础和偏技术的公众号,甚至其中包括一些可能阅读量很低的包含代码的技术文,不知道你是不是喜欢,期待你的关注。

代码分享

https://gitee.com/naimaohome

微信公众号 点击关于我,加入QQ群,即可获取到代码以及高级进阶视频和电子书!!

img

如果你觉得文章还不错,就请点击右上角选择发送给朋友或者转发到朋友圈~

● 扫码关注我们

据说看到好文章不推荐的人,服务器容易宕机!

本文版权归 发哥讲博客园 共有,原创文章,未经允许不得转载,否则保留追究法律责任的权利。

 

 

posted @ 2020-07-21 15:13  发哥讲Java  阅读(244)  评论(0编辑  收藏  举报