桥接模式也称为桥梁模式,接口模式或柄体模式,是将抽象部分与它的具体实现分离,使他们都可以独立地变化,属于结构型模式。
抽象:该类持有一个对实现角色的引用,抽象角色中的方法需要实现角色来实现。抽象角色一般为抽象类(构造函数规定子类要传入一个实现对象);
修改抽象:Abstraction的具体实现,对Abstraction的方法进行完善和扩展;
实现:确定实现维度的基本操作,提供给Abstraction使用。该类一般为接口或抽象类;
具体实现:Implementor的具体实现
public abstract class Abstraction {
protected IImplementor mImplementor;
public Abstraction(IImplementor implementor) {
this.mImplementor = implementor;
}
public void operation() {
this.mImplementor.operationImpl();
}
}
public class ConcreteImplementorA implements IImplementor {
public void operationImpl() {
System.out.println("I'm ConcreteImplementor A");
}
}
public class ConcreteImplementorB implements IImplementor {
public void operationImpl() {
System.out.println("I'm ConcreteImplementor B");
}
}
public interface IImplementor {
void operationImpl();
}
public class RefinedAbstraction extends Abstraction {
public RefinedAbstraction(IImplementor implementor) {
super(implementor);
}
@Override
public void operation() {
super.operation();
System.out.println("refined operation");
}
}
public class Test {
public static void main(String[] args) {
// 来一个实现化角色
IImplementor imp = new ConcreteImplementorA();
// 来一个抽象化角色,聚合实现
Abstraction abs = new RefinedAbstraction(imp);
// 执行操作
abs.operation();
}
}
当一个类内部具备两种或多种变化维度时,使用桥接模式可以解耦这些变化的维度,使高层代码架构稳定。桥接模式适用于以下几种业务场景:
1,在抽象和具体实现之间需要增加更多的灵活性的场景。
2一个类存在两个(或多个)独立变化的维度,而这两个(或多个)维度都需要独立进行扩展。
3,不希望使用继承,或因为多层继承导致系统类的个数剧增。
优点1,分离抽象部分及其具体实现部分
2,提高了系统的扩展性
3,符合开闭原则
4,符合合成复用原则
缺点:
1,增加系统的理解与设计难度
2,需要正确地识别系统中两个独立变化的维度