Java设计模式 —— 桥接模式

10 桥接模式

10.1 桥接模式概述

Bridge Pattern: 将抽象部分与它的实现部分解耦,使得两者都能够独立变化。

桥接模式是一种很实用的结构型模式,如果系统中某个类存在两个独立变化的维度,通过桥接模式将这两个维度分离出来,使两者可以独立扩展。

桥接模式结构图如下所示:

10.2 桥接模式实现

10.2.1 抽象类

它通常是抽象类,而不是接口,其中定义了一个实现类接口的对象并维护该对象。

public abstract class Abstraction {
  private Implement impl;
  
  public void setImplement(Implement impl) {
    this.impl = impl;
  }
  
  public void operation();
}

10.2.2 具体类

public class Concrete extends Abstraction {
  // 实现父类的抽象方法
  public void operation() {
    impl.operationImpl();
  }
}

10.2.3 实现类接口

public interface Implement {
  public void operationImpl();
}

10.2.4 具体实现类

它实现了 Implement 接口,在不同的 ConcreteImplement 中提供操作的不同实现。

public class ConcreteImplementA implements Implement {
  public void operationImpl() {
    // 具体业务逻辑实现 A
  }
}


public class ConcreteImplementB implements Implement {
  public void operationImpl() {
    // 具体业务逻辑实现 B
  }
}

10.2.5 客户端调用类

public class Client {
  public static void main(String[] args) {
    Abstraction abs = new ConcreteA();
    Implement impl = new ImplementA();
    
    abs.setImplment(impl);
    abs.operation();
  }
}

10.3 结合具体例子理解桥接模式

可能光看上面对桥接模式的理论有点难以理解,下面我门结合具体的例子来解释桥接模式做了什么,这么做的优势在哪里。

例子说明:

某软件系统要求能够显示 JPG、GIF、PNG 等多种格式图片,且能够在 Windows、Linux 等多个操作系统上运行。系统首先将各种格式文件转换为像素矩阵,在不同的操作系统中调用不同的绘制函数来绘制像素矩阵。系统需要较好的扩展性,以便在将来支持更多的图片格式和操作系统。

这个例子就将图片格式与操作系统这两个独立变化的维度分离。如果这两个成员变量都耦合在一个类中,那么要实现上述的扩展则需要 3 * 2 = 6 个子类来实现,而分离出来独立变化则只需要 3 + 2 = 5 个额外的类,当然变化的维度越多,桥接模式的效果则越显著。

10.4 桥接模式优/缺点

桥接模式的优点主要如下:

  • 分离抽象接口与其实现部分,使得抽象部分和实现部分可以沿着各自的维度变化
  • 桥接模式可以取代多层继承方案,极大地减少子类的个数
  • 桥接模式提高了系统的扩展性,增加/删除都不需要修改原有代码,符合开闭原则

桥接模式的缺点主要如下:

  • 增加系统的理解与设计难度,因为关联关系建立在抽象层,要求一开始就针对抽象层进行设计
posted @ 2022-10-08 14:13  ylyzty  阅读(303)  评论(0编辑  收藏  举报