桥接设计模式介绍
桥接设计模式(Bridge Pattern)是一种结构型设计模式,用于将抽象部分与实现部分解耦,使它们可以独立地变化。桥接模式的主要目的是在不改变抽象部分的前提下,为抽象部分提供多种实现方式。
桥接模式的主要组成部分如下:
- Abstraction(抽象类):定义了抽象部分,包含了抽象方法和基本方法。抽象方法描述了抽象部分的功能,而基本方法描述了抽象部分的实现细节。
- Implementor(实现类):实现了抽象部分的基本方法。实现类可以是多个,每个实现类都提供了不同的实现方式。
- RefinedAbstraction(精化抽象类):继承自抽象类,并且实现了更多的抽象方法。精化抽象类的作用是将抽象部分进一步细化,并提供更具体的实现方式。
- Bridge(桥接类):连接抽象部分和实现部分。桥接类继承了抽象类,并且实现了实现类。桥接类的作用是将抽象部分和实现部分解耦,使它们可以独立地变化。
桥接模式的应用场景包括:
- 当抽象部分和实现部分之间存在很大的差异时,可以使用桥接模式来解耦它们。
- 当抽象部分需要有多种实现方式时,可以使用桥接模式来提供多种实现方式。
- 当抽象部分和实现部分都需要扩展时,可以使用桥接模式来避免代码的冗余和耦合。
- 优点:
抽象与实现分离,可以独立地进行变化。
提高了可扩展性。
符合单一职责原则,抽象部分专注于抽象化,实现部分专注于具体实现。 - 缺点:
增加了系统的复杂性。
桥接模式的优势在于它可以将抽象部分和实现部分解耦,使它们可以独立地变化。这使得系统更加灵活,易于维护和扩展。同时,桥接模式也减少了代码的冗余和耦合,提高了代码的可读性和可维护性。
桥接模式的实现
- 首先我们定义具体实现化类的相关 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");
}
}
- 接下来编写抽象化类的相关内容,可以理解为 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();
}
}
- 这里展示桥接的过程:
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 方法。
这个例子展示了桥接模式的核心概念,即将抽象与实现分离。这种分离使得我们可以独立地改变抽象类和实现类,提高了代码的可扩展性和可维护性。同时,这种设计也符合了单一职责原则,使得抽象部分和实现部分各自关注自己的核心职责。
评论区