XiaoLin's Blog

Xiao Lin

桥接设计模式学习笔记

4
2024-02-26

桥接设计模式介绍

桥接设计模式(Bridge Pattern)是一种结构型设计模式,用于将抽象部分与实现部分解耦,使它们可以独立地变化。桥接模式的主要目的是在不改变抽象部分的前提下,为抽象部分提供多种实现方式。

桥接模式的主要组成部分如下:

  1. Abstraction(抽象类):定义了抽象部分,包含了抽象方法和基本方法。抽象方法描述了抽象部分的功能,而基本方法描述了抽象部分的实现细节。
  2. Implementor(实现类):实现了抽象部分的基本方法。实现类可以是多个,每个实现类都提供了不同的实现方式。
  3. RefinedAbstraction(精化抽象类):继承自抽象类,并且实现了更多的抽象方法。精化抽象类的作用是将抽象部分进一步细化,并提供更具体的实现方式。
  4. Bridge(桥接类):连接抽象部分和实现部分。桥接类继承了抽象类,并且实现了实现类。桥接类的作用是将抽象部分和实现部分解耦,使它们可以独立地变化。

桥接模式的应用场景包括:

  1. 当抽象部分和实现部分之间存在很大的差异时,可以使用桥接模式来解耦它们。
  2. 当抽象部分需要有多种实现方式时,可以使用桥接模式来提供多种实现方式。
  3. 当抽象部分和实现部分都需要扩展时,可以使用桥接模式来避免代码的冗余和耦合。
  • 优点:
    抽象与实现分离,可以独立地进行变化。
    提高了可扩展性。
    符合单一职责原则,抽象部分专注于抽象化,实现部分专注于具体实现。
  • 缺点:
    增加了系统的复杂性。

桥接模式的优势在于它可以将抽象部分和实现部分解耦,使它们可以独立地变化。这使得系统更加灵活,易于维护和扩展。同时,桥接模式也减少了代码的冗余和耦合,提高了代码的可读性和可维护性。

桥接模式的实现

  1. 首先我们定义具体实现化类的相关 api,这里我们可以理解为具体的 mysql 的实现:
// 可以当做具体的jdbc实现
interface Implementor {
    void operationImpl();
}

// 具体实现化类A,具体实现可以多样化,独立变化
class ConcreteImplementorA implements Implementor {
    @Override
    public void operationImpl() {
        System.out.println("具体实现A");
    }
}

// 具体实现化类B
class ConcreteImplementorB implements Implementor {
    @Override
    public void operationImpl() {
        System.out.println("具体实现B");
    }
}


  1. 接下来编写抽象化类的相关内容,可以理解为 jdbc 提供的 api 接口:
abstract class Abstraction {
    protected Implementor implementor;

    // 抽象依赖实现的接口,而不依赖实现本身
    public Abstraction(Implementor implementor) {
        this.implementor = implementor;
    }

    abstract void operation();
}

// 抽象化类
class RefinedAbstraction extends Abstraction {
    public RefinedAbstraction(Implementor implementor) {
        super(implementor);
    }

    // 请记住这里的方法名字不同,他们不需要实现相同的接口,他可以独立变化
    @Override
    void operation() {
        implementor.operationImpl();
    }
}


  1. 这里展示桥接的过程:
public class BridgePatternDemo {
    public static void main(String[] args) {
        Implementor implementorA = new ConcreteImplementorA();
        Abstraction abstractionA = new RefinedAbstraction(implementorA);
        abstractionA.operation();

        Implementor implementorB = new ConcreteImplementorB();
        Abstraction abstractionB = new RefinedAbstraction(implementorB);
        abstractionB.operation();
    }
}

在这个例子中,我们有一个抽象化类 Abstraction 和一个实现化接口 Implementor。通过将抽象化类与实现化接口分离,我们可以在不影响客户端的情况下更改实现。具体来说,我们可以轻松地为 Implementor 添加新的具体实现类,同时在 Abstraction 类的子类中使用这些新的实现。

在上述示例中,我们创建了两个具体实现化类 ConcreteImplementorA 和 ConcreteImplementorB,它们分别实现了 Implementor 接口。然后,我们创建了一个扩展抽象化类 RefinedAbstraction,它扩展了抽象化类 Abstraction 并实现了 operation 方法。在 BridgePatternDemo 的 main 方法中,我们分别使用了这两个具体实现类来创建 Abstraction 类的实例,并调用了它们的 operation 方法。

这个例子展示了桥接模式的核心概念,即将抽象与实现分离。这种分离使得我们可以独立地改变抽象类和实现类,提高了代码的可扩展性和可维护性。同时,这种设计也符合了单一职责原则,使得抽象部分和实现部分各自关注自己的核心职责。