桥梁模式(Bridge Pattern)也称桥接模式,是一种简单的、不常使用的设计模式。
定义:
- 将抽象和实现解耦,使得两者可以独立地变化。
桥梁模式类图如下所示。
桥梁模式有以下4个角色:
- 抽象化(Abstraction)角色:定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般是抽象类。
- 实现化(Implementor)角色:给出实现化角色的接口,但不给出具体实现。
- 修正抽象化(RefinedAbstraction)角色:扩展抽象化角色,它引用实现化角色并对抽象化角色进行修正。
- 具体实现化(ConcreteImplementor)角色:对实现化角色接口中的方法进行具体实现。
Implementor
// 实现化角色 public interface Implementor { // 方法的实现化声明 public void operationImp(); }
ConcreteImplementor.java
// 具体实现化角色 public class ConcreteImplementor implements Implementor { @Override public void operationImp() { } }
Abstraction.java
// 抽象化角色 public abstract class Abstraction { // 定义对实现化角色的引用 private Implementor imp; public Abstraction(Implementor imp) { this.imp = imp; } public void operation() { this.imp.operationImp(); } }
RefinedAbstraction.java
// 修正抽象化角色 public class RefinedAbstraction extends Abstraction { public RefinedAbstraction(Implementor imp) { super(imp); } // 修正父类的方法 public void operation() { // 业务代码 } }
Client.java
public class Client { public static void main(String[] args) { // 定义一个实现化角色 Implementor imp = new ConcreteImplementor(); // 定义一个抽象化角色 Abstraction abs = new RefinedAbstraction(imp); // 执行 abs.operation(); } }
优点:
- 抽象和实现分离是桥梁模式的主要特点,是为了解决继承的缺点而提出的设计模式。在该模式下,实现可以不受抽象的约束,不用绑定在一个固定的抽象层次上。
- 实现对客户透明,客户端不用关心细节的实现,它已经由抽象层通过聚合关系完成了封装。
- 提高灵活性和扩展性。
使用场合:
- 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
- 设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
- 一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合,
- 不希望或不适用使用继承的场合。继承具有强入侵性质,即父类有的方法,子类必须有;桥梁模式是弱关系联系。因此对于比较明确不发生变化的,则可以通过继承完成;若不能确定是否会发生变化,则通过桥梁模式来解决。
注意:
- 使用桥梁模式主要考虑如何拆分抽象和实现,桥梁模式的意图还是对变化的封装,尽量把可能变化的因素封装到最细、最小的逻辑单元中,避免风险扩散。
摘自:
青岛东合信息技术有限公司 . 设计模式(Java版) . 电子工业出版社,2012,93-95.