结构型模式-桥接模式

Posted zhaoqiang-lab

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构型模式-桥接模式相关的知识,希望对你有一定的参考价值。

桥接模式

原文链接:https://www.cnblogs.com/adamjwh/p/9033548.html

一、什么是桥接模式

? 桥接模式,又叫做桥梁模式,顾名思义,就是有座“桥”,那这座桥是什么呢?就是一条聚合线(下方UML图),比如我们下面会举的例子:手机又手机品牌和手机游戏等等,每个手机品牌都有多款手机游戏,那是不是二者之间就聚合了?这就是合成、聚合复用的体现,当我们发现类又多层据称是,就可以考虑使用桥接模式,用聚合代替继承。

? 桥接模式(Bridge):将抽象部分与他的实现部分分离,使他们都可以独立的变化。UML结构图如下:

技术图片
  • Abstraction: 未抽象化的角色,定义出该角色的行为,同时保存一个对实现化角色的引用;
  • Implementor:是实现化角色,他是接口或者抽象类,定义角色必须的行为和属性,
  • RefinedAbstraction:为修正抽象化角色,引用实现化角色对抽象化角色进行修正,
  • ConcreteImplementor:为具体实现化角色,实现接口或者抽象类定义的方法或者属性,

说简单点就是在Abstraction 和 Implementor之间架了一座桥梁(聚合线),这里体现了一个原则,就是合成,服用原则,具体看下面代码示例。

二、桥接模式的应用

  1. 何时使用
    1. 系统可能有多个角度分类,每一种角度都有可能变化时
  2. 方法
    1. 把这种角度变化分离出来,让他们单独变化,减少他们之间的耦合
  3. 优点
    1. 抽象和实现分离,桥梁模式完全是为了解决继承的缺点而提出的设计模式
    2. 优秀的拓展能力
    3. 实现细节对客户头透明。客户不用担心细节的实现,它已经由抽象层通过聚合关系完成了封装
  4. 缺点:
    1. 会增加系统的理解与设计难度。由于聚合关系简历在抽象层,要求开发者针对抽象进行设计与编程
  5. 使用场景
    1. 不希望或者不适用使用继承的场景
    2. 接口或者抽象类不稳定的场景
    3. 重用性要求比较高的场景
  6. 应用实例
    1. 开关。我们可以看到开关是抽象的,不管里面集体怎么实现
    2. 手机品牌与手机软件。两者间有一条聚合线,一个手机品牌可以有多个聚合线
  7. 注意事项
    1. 不要一涉及继承就考虑该模式,尽可能把变化的因素封装到最细、最小的逻辑单元中,避免风险扩散
    2. 当发现类的继承有N层时,可以考虑该模式

三、桥接模式的实现

? 我们有一个作为桥接实现的 DrawAPI 接口和实现了 DrawAPI 接口的实体类 RedCircleGreenCircleShape 是一个抽象类,将使用 DrawAPI 的对象。BridgePatternDemo,我们的演示类使用 Shape 类来画出不同颜色的圆。

  1. 创建桥接实现实现接口。

    public interface DrawAPI {
       public void drawCircle(int radius, int x, int y);
    }
    
  2. 创建实现了DrawAPI 接口的实体桥接实现类,

    public class RedCircle implements DrawAPI {
       @Override
       public void drawCircle(int radius, int x, int y) {
          System.out.println("Drawing Circle[ color: red, radius: "
             + radius +", x: " +x+", "+ y +"]");
       }
    }
    
    public class GreenCircle implements DrawAPI {
       @Override
       public void drawCircle(int radius, int x, int y) {
          System.out.println("Drawing Circle[ color: green, radius: "
             + radius +", x: " +x+", "+ y +"]");
       }
    }
    
    
  3. 使用 DrawAPI 接口创建抽象类 Shape

    public abstract class Shape {
       protected DrawAPI drawAPI;
       protected Shape(DrawAPI drawAPI){
          this.drawAPI = drawAPI;
       }
       public abstract void draw();  
    }
    
  4. 创建实现了Shape 接口的实体类。

    public class Circle extends Shape {
       private int x, y, radius;
     
       public Circle(int x, int y, int radius, DrawAPI drawAPI) {
          super(drawAPI);
          this.x = x;  
          this.y = y;  
          this.radius = radius;
       }
     
       public void draw() {
          drawAPI.drawCircle(radius,x,y);
       }
    }
    
  5. 使用 ShapeDrawAPI 类画出不同颜色的圆。

    public class BridgePatternDemo {
       public static void main(String[] args) {
          Shape redCircle = new Circle(100,100, 10, new RedCircle());
          Shape greenCircle = new Circle(100,100, 10, new GreenCircle());
     
          redCircle.draw();
          greenCircle.draw();
       }
    }
    
  6. 执行程序,输出结果

    Drawing Circle[ color: red, radius: 10, x: 100, 100]
    Drawing Circle[ color: green, radius: 10, x: 100, 100]
    

以上是关于结构型模式-桥接模式的主要内容,如果未能解决你的问题,请参考以下文章

[设计模式C++go]结构型模式:桥接模式

[设计模式C++go]结构型模式:桥接模式

Python 设计模式 — 结构型模式 — 桥接模式

Python 设计模式 — 结构型模式 — 桥接模式

设计模式之桥接模式

设计模式之桥接模式(结构型)