桥接模式
目的
将抽象与实现分离开来,使它们可以独立变化。
类图
角色
- Abstraction:抽象类
- RefinedAbstraction:扩充抽象类
- Implementor:实现类接口
- ConcreteImplementor:具体实现类
动机
当某个类具有两个以上维度,如果事先就把每一个维度进行组合,那类的个数就是 n m ...* l 了,如果将各维度抽象出来,之后在通过聚合,根据实际需求组合,减少了不必要继承或实现,也减少了维度间的耦合。
实现
实现类接口
public interface Implementor {
public void operationImpl();
}
具体实现类
public class ConcreteImplemento1 implements Implementor {
@Override
public void operationImpl() {
}
}
public class ConcreteImplemento2 implements Implementor {
@Override
public void operationImpl() {
}
}
抽象类
abstract class Abstraction {
protected Implementor impl; //定义实现类接口对象
public Abstraction(Implementor impl) {
this.impl=impl;
}
public abstract void operation(); //声明抽象业务方法
}
拓展抽象类
class RefinedAbstraction1 extends Abstraction {
public RefinedAbstraction1(Implementor implementor) {
super(implementor);
}
public void operation() {
//业务代码
impl.operationImpl(); //调用实现类的方法
//业务代码
}
}
class RefinedAbstraction2 extends Abstraction {
public RefinedAbstraction2(Implementor implementor) {
super(implementor);
}
public void operation() {
//业务代码
impl.operationImpl(); //调用实现类的方法
//业务代码
}
}
调用
public class Client {
public static void main(String[] args) {
Abstraction abstraction = new RefinedAbstraction1(new ConcreteImplemento2());
abstraction.operationImpl();
}
}
优缺点
优点
- 分离抽象接口及其实现部分。
- 提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
- 实现细节对客户透明,可以对用户隐藏实现细节。
缺点
- 会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
- 要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。
场景
- 需要在构件的抽象化角色和具体化角色之间增加更多灵活性,避免在两个层次间建立静态的继承联系。
- 即系统需要对抽象化角色和实现化角色进行动态耦合。
- 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
- 不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统。