桥接模式学习笔记
桥接模式是一种很实用的结构型设计模式,如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使得两者可以独立扩展。
桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联取代了传统的多层继承,将类之间的静态继承关系转换为动态的对象组合关系。
定义:桥接模式将抽象部分和实现部分分离,使得它们都可以独立地变化。它是一种对象结构型模式。
下图是桥接模式的结构图:
从上图中可以发现包含如下几个角色:
Abstraction抽象类接口:通常是抽象类而不是接口,包含业务方法,并且持有一个Implementor的对象。
RefineAbstraction扩充抽象类:实现在Abstraction抽象类中声明的业务方法,同时还可以调用Implementor中的方法。
Implementor实现类接口:不一定要和Abstraction类中的接口一致,通常Implementor中只是提供基本操作,而在Abstraction中才提供复杂操作。
ConcreteImplementor具体实现类:实现Implementor中的接口。
实现代码:
interface Implementor {
public void operationImpl();
}
abstract class Abstraction {
protected Implementor impl;
public void setImpl(Implementor impl) {
this.impl = impl;
}
public abstract void operation();
}
class RefinedAbstraction extends Abstraction {
public void operation() {
impl.operationImpl();
}
}
那么在客户端:
class Client {
public static void main(String args[]) {
Implementor impl = new ConcreteImplememtor();
Abstraction ab = new RefinedAbstraction();
ab.setImpl(impl);
ab.operation();
}
}
客户端编程时都是和抽象类打交道,诸如Abstraction类和Implementor类,而在执行期间才会真正的调用具体类的方法,并且在Abstraction类中是持有Implememtor的对象的,因此可以调用实现部分的业务方法的。
总结:
桥接模式分离抽象接口及其实现部分,使用对象之间的关联关系来解耦抽象及实现的关系。桥接模式可以取代多层继承的方案,在两个变化维度中任意扩展一个维度都不需要修改原有系统。
如果一个系统需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,通过桥接模式可以使它们在抽象层建立一个联系。
可以对抽象部分和实现部分独立扩展而互不影响。对于那些不希望使用继承或者因为多层继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。