BRIDGE(桥接)– 对象结构型模式

  1. 意图:
    将抽象部分与它的实现部分分离,使它们都可以独立地变化。

  2. 别名:
    Handle/Body

  3. 动机:

  4. 适用性:
    a. 你不希望在抽象和它的实现部分之间有一个固定的绑定关系。
    b. 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。
    c. 对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。
    d. 你想对客户完全隐藏抽象的实现部分。
    e. 你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。

  5. 结构:
    桥接模式结构图

  6. 参与者:
    a. Abstraction: 定义抽象类的接口。维护一个指向那个Implementor类型对象的指针。
    b. RefinedAbstraction: 扩充由Abstaction定义的接口。
    c. Implementor: 定义实现类的接口,该接口不一定要与Abstraction的接口完全一致;事实上两个接口可以完全不同。
    一般来讲,Implementor接口仅提供基本操作,而Abstraction则定义了基于这些基本操作的较高层次的操作。
    d. ConcreteImplementor: 实现Implementor接口并定义它的的具体实现。

  7. 协作:
    Abstract将client的请求转发给它的Implement对象。

  8. 效果:
    a. 分离接口及其实现部分
    b. 提高可扩充性
    c. 实现细节对客户透明

  9. 实现:
    a. 仅有一个Implementor
    d. 创建正确的Implementor对象
    c. 共享Implementor对象
    d. 采用多重继承机制

  10. 代码示例:

    public abstract class Abstraction {
        //维护实现器的指针
        private Implementor implementor;
    
        public Abstraction(Implementor implementor) {
            this.implementor = implementor;
        }
    
        public String operation() {
            return implementor.operationImp();
        }
    }
    
    public class RefinedAbstraction extends Abstraction {
        public RefinedAbstraction(Implementor implementor) {
            super(implementor);
        }
    }
    
    public interface Implementor {
        public String operationImp();
    }
    
    public class ConcreteImplementorA implements Implementor {
        @Override
        public String operationImp() {
            return "This is ConcreteImplementorA";
        }
    }
    
    public class ConcreteImplementorB implements Implementor {
        @Override
        public String operationImp() {
            return "This is ConcreteImplementorB";
        }
    }
    
    public class Client {
        public static void main(String[] args) {
            Implementor implementor = new ConcreteImplementorA();
            Abstraction abstraction = new RefinedAbstraction(implementor);
            String operation = abstraction.operation();
            System.out.println(operation);
        }
    }
    
  11. 已知应用:

  12. 相关模式:
    Abstract Factory模式可以用来创建和配置一个特定的Bridge模式。
    Adapter模式用来帮助无关的类协同工作,它通常在系统设计完成后才会被使用。
    Bridge模式则是在系统开始时就被使用,它使得抽象接口和实现部分可以独立进行改变。