Skip to content

桥接模式

桥接模式(Bridge Pattern)属于结构型模式的范畴。该模式旨在将抽象部分与它的实现部分分离,使它们可以独立地变化。通过桥接模式,我们可以有效地处理那些在多个维度上可能发生变化的复杂系统,保证了系统的灵活性和可扩展性。

《大话设计模式》

实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让他们独立变化,减少他们之间的耦合

核心思想

桥接模式的核心在于“解耦”和“多维度变化”的处理。它通过将一个类的抽象(定义了操作的接口)与它的实现细节(具体的操作方法)分离,使得两者可以沿着各自的维度独立发展,互不影响。这种分离是通过组合而非继承的方式来实现的,从而避免了继承体系的过度复杂和僵化。

合成/聚合复用原则优势

”对象的继承关系是在编译时就定义好了,所以无法在运行时改变从父类继承的实现。子类的实现与它的父类有紧密的依赖关系,以致于父类实现中的任何变化必然会导致子类发生变化。当需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。“

”优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小的规模,并且不太可能增长为不可控制的庞然大物“

类图

桥接模式

模式角色

  • Abstraction(抽象类): 定义了客户端可以使用的接口,同时维持一个对实现类的引用,但不具体实现任何行为,而是将行为委托给实现类。
  • Refined Abstraction(修正抽象类/接口): 是抽象类的扩展,可能会添加一些新的操作或行为,同时使用抽象类中定义的接口来与实现类交互。
  • Implementor(实现者接口): 定义了实现类需要提供的具体行为接口,不涉及抽象类的接口。
  • Concrete Implementor(具体实现类): 实现了Implementor接口,提供了具体的行为实现。

适用场景

  1. 避免类爆炸: 当一个类有多个维度的变化,如果使用继承来实现,将会产生大量的子类组合,导致类的数量激增。
  2. 独立变化: 当抽象部分和实现部分可以沿着不同的方向变化,且这些变化应当互不影响时。
  3. 后期绑定: 需要在运行时决定具体实现类的选择,以达到更高的灵活性。

示例

java
//Implementor类
public abstract class Implementor {
    public abstract void operation();
}
//Implementor派生类
public class ConcreteImplementorA extends Implementor{
    @Override
    public void operation() {
        System.out.println("ConcreteImplementorA");
    }
}
//...
//Abstraction
public abstract class Abstraction {
    protected Implementor implementor;

    public void setImplementor(Implementor implementor) {
        this.implementor = implementor;
    }

    public void operation()
    {
        implementor.operation();
    }
}
//RefinedAbstraction	 
public class RefinedAbstraction extends Abstraction{
    public void operation()
    {
        System.out.println("RefinedAbstraction.operation()");
        implementor.operation();
    }
}
//客户端
public class Client {
    public static void main(String[] args) {
        Abstraction abstraction;
        abstraction = new RefinedAbstraction();
        abstraction.setImplementor(new ConcreteImplementorA());
        abstraction.operation();
        abstraction.setImplementor(new ConcreteImplementorB());
        abstraction.operation();
    }
}

Released under the MIT License.