意图
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
例子
|
|
|
准备动物public abstract class Animal {
protected Food food;
public Animal(Food food) {
this.food = food;
}
pubic abstract void eat(Food food);
}
|
|
这个流程代码中写的很清楚了public class Main {
public static void main(String args[]) {
new Dog(new DogFood()).eat();
new Dog(new CatFood()).eat();
}
}
看着狗在吃猫粮,原则上有点说不通,但是确实可以,只要是粮食。整个设计是将抽象类嵌入一个接口,让他具有使用这个接口的能力。
适用性
- 不希望在抽象和他的实现部分之间有一个固定的绑定关系。例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。
- 类的抽象以及他的实现都应该可以通过生成子类的方法加以扩充。这时桥接模式使你可以对不同的抽象接口和实现部分进行组合,并分别对他们进行扩充。
- 对一个抽象的实现部分的修改应对客户不产生影响,及客户的代码不必重新编译。
- 必须将一个对象分解成两个部分。称这种类层次结构为嵌套的概括。
- 在多个对象间共享实现(可能是引用计数),但同时要求客户并不知道这一点。
结构
协作
Abstraction 将 client 的请求转发给它的 implements 对象。
效果
Bridge 模式有以下一些优点:
�个实现未必不变地绑定在一个接口上。抽象类的实现可以在运行时刻进行配置,一个对象甚至可以在运行时刻改变它的实现。
将 Abstraction 与 Implementor 分离有助于降低对实现部分编译时刻的依赖性,当改变一个实现类时,并不需要重新编译 Abstraction 类和它的客户程序。为了保证一个类库的不同版本之间的二进制兼容性,一定要有这个性质。
另外,接口与实现分离有助于分层,从而产生更好的结构化系统,系统的高层部分仅需 知道 Abstraction 和 Implementor 即可。
- 提高可扩充性
- 实现细节对客户透明
��充。
- 实现细节对客户透明