桥接模式
桥接模式(Bridge Pattern),也叫做桥梁模式,结构型设计模式的一种,这个模式相对来说有些难理解。桥接,顾名思义,就是用来连接两个部分,为被分离了的抽象部分和实现部分搭桥。
官方一点的说法叫:将抽象部分与它的实现部分分离,使它们都可以独立变化。
还有另外一种理解方式:一个类存在两个(或多个)独立变化的维度,我们通过组合的方式,让这两个(或多个)维度可以独立进行扩展。
适用场景
- 如果一个系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,可以通过桥接模式使他们在抽象层建立一个关联关系;
- 那些不希望使用继承或因为多层次继承导致系统类的个数极具增加的系统;
- 一个类存在两个独立变化的维度,而这两个维度都需要进行扩展。
UML 类图
- 抽象化角色 Abstraction:定义抽象的接口,包含一个对实现化角色的引用,抽象角色的方法需要调用实现化角色;
- 扩展抽象化角色RefinedAbstraction:抽象化角色的子类,一般对抽象部分的方法进行完善和扩展,实现父类中的业务方法,并通过组合/聚合关系调用实现化角色中的业务方法
- 实现化角色 Implementor:定义具体行为、具体特征的应用接口,供扩展抽象化角色使用,一般情况下是由实现化角色提供基本的操作,而抽象化角色定义基于实现部分基本操作的业务方法;
- 具体实现化角色 ConcreteImplementor:完善实现化角色中定义的具体逻辑。
代码实现
实现化角色
/**
* @author lq
* @PACKAGE_NAME: com.lq
* @CLASS_NAME: Implementor
* @date 2022/11/13 12:35
* @Description: 实现化角色
*/
public interface Implementor {
void operationImpl();
}
具体实现化角色
/**
* @author lq
* @PACKAGE_NAME: com.lq.bridge
* @CLASS_NAME: ConcreteImplementorA
* @date 2022/11/13 12:36
* @Description: 具体实现化角色
*/
public class ConcreteImplementorA implements Implementor{
@Override
public void operationImpl() {
System.out.println("ConcreteImplementorA");
}
}
class ConcreteImplementorB implements Implementor{
@Override
public void operationImpl() {
System.out.println("ConcreteImplementorB");
}
}
抽象化角色
/**
* @author lq
* @PACKAGE_NAME: com.lq.bridge
* @CLASS_NAME: Abstraction
* @date 2022/11/13 12:36
* @Description: 抽象化角色
*/
public abstract class Abstraction {
private Implementor implementor;
public Abstraction(Implementor implementor) {
this.implementor = implementor;
}
public void operation() {
implementor.operationImpl();
}
}
扩展抽象化角色
/**
* @author lq
* @PACKAGE_NAME: com.lq.bridge
* @CLASS_NAME: RefinedAbstraction
* @date 2022/11/13 12:37
* @Description: 扩展抽象化角色
*/
public class RefinedAbstraction extends Abstraction {
public RefinedAbstraction(Implementor implementor) {
super(implementor);
implementor.operationImpl();
}
}
测试
/**
* @author lq
* @PACKAGE_NAME: com.lq.bridge
* @CLASS_NAME: Main
* @date 2022/11/13 12:38
* @Description:
*/
public class Main {
public static void main(String[] args) {
Implementor concreteImplementorA = new ConcreteImplementorA();
RefinedAbstraction refinedAbstraction=new RefinedAbstraction(concreteImplementorA);
}
}
输出:
ConcreteImplementorA