桥接模式(Bridge)
一:纲要
- 桥接模式的定义(目的)
- 桥接模式的使用场景
- 桥接模式的实现
二:定义(目的)
将抽象和实现解耦,使得两者可以独立变化。
三:使用
3.1 桥接模式适用于设计阶段,不同于“装饰模式”、“适配器模式”这些主要用于扩展功能的模式。
3.2 场景
- 不希望或者不使用继承的场景 如:在可以预见子类之间差异比较大的情况
- 接口或抽象类不稳定的情况
- 重用性要求较高的场景
四:实现
4.1 如何将抽象和实现解耦? 将实现作为抽象的一个引用, 有点类似于代理, 但是抽象和实现的接口不需要完全一致。
4.2 角色
- Abstraction(抽象化角色) 定义抽象接口, 保存一个实现化角色的引用
- RedefinedAbstraction 扩展Abstraction接口
- Implementor(实现化角色)是一个接口或抽象类, 定义角色必须的行为和属性, 不需要和Abstraction的接口一样,两者是独立的
- ConcreteImplementor(具体实现角色) 继承Implementor
4.3结构
4.4例子(模板)(java)
实现化角色:
public interface Implementor{
public void doSomething();
public void doAnything();
}
具体实现化角色:
public class ConcreteImplementor1 implements Implementor{
@Override
public void doSomething() {
// TODO Auto-generated method stub
}@Override
public void doAnything() {
// TODO Auto-generated method stub
}
}public class ConcreteImplementor2 implements Implementor{
@Override
public void doSomething() {
// TODO Auto-generated method stub
}@Override
public void doAnything() {
// TODO Auto-generated method stub
}
}
抽象化角色:
public abstract class Abstraction{
private Implementor impl;
public Abstraction(Implementor _impl){
this.impl = _impl;
}
public void request(){
this.impl.doSomething();
}
public Implementor getImplementor(){
return this.impl;
}
}
具体抽象化角色:
public class RedefinedAbstraction extends Abstraction{
public RedefinedAbstraction(Implementor _impl) {
super(_impl);
// TODO Auto-generated constructor stub
}
@Override
public void request() {
// TODO Auto-generated method stub
super.request();
this.getImplementor().doAnything();
}
}
场景:
Implementor implementor = new ConcreteImplementor1();
Abstraction abstraction = new RedefinedAbstraction(implementor);
abstraction.request();//Implementor 和 Abstraction 在 Abstraction 对象初始化的时候才绑定在一起
五:继承的缺点
强侵入是继承的一个明显缺点。父类拥有某个方法,则子类不可选择的也要有这个方法。
假设有类A、B、C, C继承于B而B继承于A。 A拥有一个接口someInterface, 则 B 和 C 都会拥有这个接口。现在在没有使用桥接模式的情况下
我们修改中间的类 B 的someInterface接口, 这样 C 也被逼的也跟着 B 的改变而改变。但是如果一开始我们就是把someInterface桥接出去的话,
我们就可以做到只修改 B 而不影响到 C。