定义
桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
相关角色
Abstraction:抽象类
RefinedAbstraction:扩充抽象类
Implementor:实现类接口
ConcreteImplementor:具体实现类
解决问题
将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化。
UML类图
例子
Abstraction
public abstract class Abstraction {
private Implementor implementor;
public void setImplementor(Implementor implementor) {
this.implementor = implementor;
}
public void operator() {
implementor.operatorImpl();
}
}
Implementor
public abstract class Implementor {
public abstract void operatorImpl();
}
ConcreteImplementor
public class ConcreteImplementor extends Implementor {
@Override
public void operatorImpl() {
System.out.println("我是实现类1");
}
}
RefinedAbstraction
public class RefinedAbstraction extends Abstraction {
public void operatorMore() {
this.operator();
System.out.println("operatorMore");
}
}
优缺点
优点:
- 分离抽象接口及其实现部分;
- 桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法;
- 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统;
- 实现细节对客户透明,可以对用户隐藏实现细节。
缺点:
- 增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程;
- 要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。
使用场景
我们再来看看桥接模式的使用场景,在以下情况下应当使用桥接模式:
如果一个系统需要在构件的抽象化角色和具体化角色之间添加更多的灵活性,避免在两个层次之间建立静态的联系。
设计要求实现化角色的任何改变不应当影响客户端,或者实现化角色的改变对客户端是完全透明的。
需要跨越多个平台的图形和窗口系统上。
一个类存在两个独立变化的维度,且两个维度都需要进行扩展。