意图
将抽象部分与其实现部分分离,使它们可以独立地变化。
桥接模式结构图:
整个图看起来像一座桥,其中,
- Abstraction定义抽象类接口,维护一个指向Implementor类型对象的指针。
- RefinedAbstraction扩充由Abstraction定义的接口。
- Implementor定义实现类的接口,该接口不一定要与Abstraction的接口完全一致;事实上这两个接口可以完全不同。一般来说,Implementor接口仅提供基本操作,而Abstraction定义了基于这些操作的较高层次的操作。
- ConcreteImplementor实现Implementor接口并定义它的具体实现。
代码逻辑并不复杂,首先定义实现类的接口Implementor
package com.zlfan.bridge;
public interface Implementor {
void operation();
}
接着它的两个实现子类
package com.zlfan.bridge;
public class ConcreteImplementorA implements Implementor {
@Override
public void operation() {
System.out.println("实现类A的operation方法");
}
}
package com.zlfan.bridge;
public class ConcreteImplementorB implements Implementor {
@Override
public void operation() {
System.out.println("实现类B的operation方法");
}
}
接下来是抽象层接口,维护了指向Implementor对象,并且在抽象层实现类扩展了新的方法extendOperation()
package com.zlfan.bridge;
public abstract class Abstraction {
private Implementor implementor;
public Abstraction(Implementor implementor){
this.implementor = implementor;
}
public void operation(){
implementor.operation();
}
}
抽象层实现类,RefinedAbstraction
package com.zlfan.bridge;
public class RefinedAbstraction extends Abstraction{
public RefinedAbstraction(Implementor implementor) {
super(implementor);
}
public void extendOperation(){
System.out.println("这是抽象层扩展的方法");
}
}
测试程序
package com.zlfan.bridge;
public class BridgeTest {
public static void main(String[] args) {
Implementor im = new ConcreteImplementorA();
Abstraction abstraction = new RefinedAbstraction(im);
abstraction.operation();
RefinedAbstraction rfabstraction = new RefinedAbstraction(im);
rfabstraction.extendOperation();
}
}
运行结果输出
实现类A的operation方法
这是抽象层扩展的方法
可以看到,通过桥接模式,在分别在实现部分和抽象部分,可以独立的进行变化。即在Abstract和Implementor的实现类中可以根据需求来变化。
总结
使用场景:
系统有多维角度分类时,而每一种分类又有可能变化时,考虑使用桥接模式。
- 不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如,这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。
- 类的抽象以及它的实现都应该可以生成子类的方法扩充。
- 对一个抽象的实现部分的修改应对客户不产生影响,即客户代码不必重新编译。
- 有许多类要生成的类层次结构。
- 想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。
桥接模式的优点:实现了抽象和实现部分的分离。更好的可扩展性。可动态的切换实现。实现细节对客户端透明,可以对用户隐藏实现细节。
缺点:桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。
桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性。