桥接模式
2024/5/22...大约 4 分钟
桥接模式
桥接模式属于结构型设计模式的一种。又称为柄体(Handle and Body)模式或接口(Interface)模式
桥接模式将抽象部分与它的实现部分分离,使它们都可以独立地变化。
桥接模式主要目的是通过组合的方式建立两个类之间的联系,而不是继承。但又类似于多重继承方案,但是多重继承方案往往违背了类的单一职责原则,其复用性较差,桥接模式是比多重继承更好的替代方案。桥接模式的核心在于解耦抽象和实现。
在以下情况可以使用Bridge模式:
- 不希望在抽象以及抽象的实现部分之间有一个固定的绑定关系。例如这种情况可能是因为,在程序运行时刻可以选择或切换实现部分;
- 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充,使用Bridge模式可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
- 对一个抽象的实现部分的修改应该对用户不产生影响,即客户的代码不必重新编译。
桥接模式优缺点
- 优点
- 分离抽象部分及具体实现部分
- 提高了系统的扩展性
- 符合开闭原则、合成复用原则
- 缺点
- 增加了系统的理解与设计难度
- 需要正确地识别系统中两个独立变化的维度
桥接模式通用写法示例
类图
单词与意思
- Refined
/rɪˈfaɪnd/
adj. 精炼的;有教养的,文雅的;精确的,灵活巧妙的
- Concrete
/ˈkɒŋkriːt/
adj. 确实的,具体的;实在的,有形的;混凝土的;物质的 n.混凝土 v.用混凝土覆盖(或做成);
- Implementor
/ˈɪmplɪmentə/
n.实现者;系统
代码
创建抽象类
/**
* 抽象 Abstraction
*/
public abstract class Abstraction {
protected Implementor implementor;
public Abstraction(Implementor implementor) {
this.implementor = implementor;
}
public abstract void operation();
}
创建修正抽象角色RefinedAbstraction:
/**
* 修正抽象 RefinedAbstraction
*/
public class RefinedAbstraction extends Abstraction{
public RefinedAbstraction(Implementor implementor) {
super(implementor);
}
@Override
public void operation() {
System.out.println("扩展抽象化(Refined Abstraction)角色被访问" );
implementor.operationImpl();
}
}
创建实现角色Implementor:
public interface Implementor {
/**
* 实现维度的基本操作,给Abstraction使用
* 一般为接口或抽象类,这里用了接口
*/
void operationImpl();
}
创建具体实现角色ConcreteImplementorA:
public class ConcreteImplementorA implements Implementor{
@Override
public void operationImpl() {
System.out.println("具体实现化(Concrete Implementor)角色被访问" );
}
}
编写测试类
public class Main {
public static void main(String[] args) {
// 实现角色A
Implementor imp = new ConcreteImplementorA();
// 抽象角色,聚合实现
Abstraction abstraction = new RefinedAbstraction(imp);
// 执行操作
abstraction.operation();
}
}
执行结果:
扩展抽象化(Refined Abstraction)角色被访问
具体实现化(Concrete Implementor)角色被访问
例子一
软件公司欲开发一个绘图软件,要求使用不同的绘图程序绘制不同的图形。在明确用户需求后,该公司的架构师决定采用Bridge模式实现该软件,并设计UML类图如下图所示。
桥接模式将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。桥接模式类似于多重继承方案,但是多重继承方案往往违背了类的单一职责原则,其复用性比较差,桥接模式是比多重继承方案更好的解决方法。
- Abstraction定义抽象类的接口;维护一个指向Implementor类型对象的指针。
- RefinedAbstraction扩充由Abstraction定义的接口。
- Implementor定义实现类的接口,该接口不一定要与Abstraction的接口完全一致;事实上这两个接口可以完全不同。一般来说,Implementor接口仅提供基本操作,而Abstraction则定义了基于这些基本操作的较高层次的操作。
- ConcreteImplementor实现Implementor接口并定义它的具体实现。
图中与Bridge模式中的“Abstraction”角色相对应的类是Shape,与“Implementor”角色相对应的类是Drawing。