设计模式--桥接模式
桥接模式也称为桥梁模式、接口模式或者柄体模式,是将抽象部分与它的具体实现部分分离,使它们都可以独立地变化,属于结构型模式。
桥接模式主要目的是通过组合的方式建立两个类之间的联系,而不是继承。但又类似于多继承的方式,但是多重继承方案往往违背了类的单一职责原则,其复用性比较差,桥接模式是比多重继承更好的替代方案。桥接模式的核心在于解耦抽象和实现。
桥接模式UML类图:
抽象(Abstraction):该类持有一个对实现角色的引用,抽象角色中的方法需要实现角色来实现。抽象角色一般为抽象类(构造函数规定子类要传入一个实现对象);
修正抽象(RefinedAbstraction):Abstraction的具体实现,对Abstraction的方法进行完善和扩展;
实现(Implementor):确定实现维度的基本操作,提供给Abstraction使用。该类一般为接口或抽象类;
具体实现(ConcreteImplementor):Implementor的具体实现。
桥接模式的通用写法:
创建抽象角色Abstraction类:
public abstract class Abstraction {
protected Implementor implementor;
public Abstraction(Implementor implementor){
this.implementor = implementor;
}
public void operation(){
this.implementor.operationImpl();
}
}
创建修正抽象角色RefinedAbstraction类:
public class RefinedAbstraction extends Abstraction{
public RefinedAbstraction(Implementor implementor){
super(implementor);
}
@Override
public void operation() {
super.operation();
System.out.println("refined operation");
}
}
创建实现角色Implementor类:
public interface Implementor {
void operationImpl();
}
创建具体实现ConcreteImplementorA类:
public class ConcreteImplementorA implements Implementor{
@Override
public void operationImpl() {
System.out.println("I'm ConcreteImplementor A");
}
}
桥接模式的应用场景:
当一个类内部具备两种或多种变化维度时,使用桥接模式可以解耦这些变化的维度,使高层代码架构稳定。桥接模式适用于以下几种业务场景:
1、在抽象和具体实现之间需要增加更多的灵活性的场景;
2、一个类存在两个(或多个)独立变化的维度,而这两个(或多个)维度都需要独立进行扩展。
3、不希望使用继承,或因为多层继承导致系统类的个数剧增。
设计模式有一个原则:优先使用组合/聚合的方式,而不是继承。
桥接模式在源码中的应用:
JDBC API,其中有一个Driver类就是桥接对象。这里以mysql为例。
类图:
桥接模式的优缺点:
桥接模式遵循了里氏替换原则和依赖倒置原则,最终实现了开闭原则,对修改关闭,对扩展开放。
优点:
1、分离抽象部分及具体实现部分
2、提高了系统的扩展性
3、符合开闭原则
4、符合合成复用原则
缺点:
1、增加了系统的理解与设计难度
2、需要正确的识别系统中两个独立变化的维度