桥接模式是解决系统耦合,和解决多维关系。实现多个抽象和实现之间的能够优雅实现的一种进阶设计模式,更多的时候被人称为结构型设计模式。
一、应用场景
有时候,更多的系统底层设计,我们需要定义好基础的类和开发能够处理很多有特性的实现。对外提供简单的接口,例如安卓的窗口管理,JDBC驱动程序等
应用原则:
- 如果一个系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,可以通过桥接模式使他们在抽象层建立一个关联关系;
- 那些不希望使用继承或因为多层次继承导致系统类的个数极具增加的系统;
- 一个类存在两个独立变化的维度,而这两个维度都需要进行扩展。
二、实现原理
桥接模式也分为四个角色:
Abstraction:抽象部分
该类保持一个对实现部分对象的引用,抽象部分中的方法需要调用实现部分的对象来实现,该类一般为抽象类;
RefinedAbstraction:优化的抽象部分
抽象部分的具体实现,该类一般对抽象部分的方法进行完善和扩展;
Implementor:实现部分
可以为接口或者是抽象类,其方法不一定要与抽象部分中的一致,一般情况下是由实现部分提供基本的操作,而抽象部分定义的则是基于实现部分基本操作的业务方法;
ConcreteImplementorA 和 ConcreteImplementorB :实现部分的具体实现、完善实现部分中定义的具体逻辑。
总之,这是一个将复杂关系的系统关系,通过抽象的关联,并将具体的实现带入到抽象当中实现的一种设计模式,好比一个小吃店,我带了一份猪耳朵去吃了一个午饭,别人带了一个馒头去吃了一个晚饭。结果我的都吃饱了,都满足了吃饭的要求。
三、具体实现
// 实现的接口
public interface Implementor {
void operationImpl();
}
// 抽象部分
public abstract class Abstraction {
private Implementor implementor;
public Abstraction(Implementor implementor) {
this.implementor = implementor;
}
public void operation() {
implementor.operationImpl();
}
}
// 抽象的实现
public static class RefinedAbstraction extends Abstraction{
public RefinedAbstraction(Implementor implementor) {
super(implementor);
}
public void refinedOperation() {
//对 Abstraction 中的 operation 方法进行扩展
}
}
// 实现部分
public static class ConcreteImplementorA implements Implementor{
@Override
public void operationImpl() {
//具体实现
}
}
public static class ConcreteImplementorB implements Implementor{
@Override
public void operationImpl() {
//具体实现
}
}
public static void main(String[] args){
// refinedAbstractionA的实现
RefinedAbstraction refinedAbstractionA = new RefinedAbstraction(new ConcreteImplementorA());
refinedAbstractionA.refinedOperation();
// refinedAbstractionB的实现
RefinedAbstraction refinedAbstractionB = new RefinedAbstraction(new ConcreteImplementorB());
refinedAbstractionB.refinedOperation();
}