学习设计模式 - 桥梁模式
结构类 - 桥梁模式
一、定义(是什么)
将抽象和实现解耦,使得两者可以独立的变化
1) Abstraction 抽象化角色
定义出该角色的行为, 并引用一个实现化角色
2) Implementor 实现化角色
定义实现化角色的行为
3) RedefinedAbstraction 修正抽象化角色
修正抽象化角色的行为, 可以通过调用实现化角色的行为, 实现特定功能, 也可以额外添加附加逻辑.
4) ConreteImplementor 具体实现化角色
具体实现实现化角色的行为
二、为什么
抽象继承本应是稳定的,在单向变化(抽象继承)之外仍然有其他变化,则通过聚合的方式,外放变化,聚合变化。
设计模式的本质是封装变化,符合最核心的原则——开闭原则,即面对修改关闭,面对扩展开放。抽象继承侵入性很强,一旦继承,子类便必须拥有该方法。当该方法对子类不适用时,子类难以去掉。当有n层继承时,修改该方法风险会很大很大。继承的耦合性太强了,当比较明确不怎么变化时,才使用抽象继承封装变化。当极其不稳定时,根据开闭原则,在继承的方法里,再次细化封装变化,通过聚合的方式,外放变化,重新聚合实现本应继承的方法。如此一来,继承方法的变化风险会降低,稳定性提高,因为已经将变化风险分摊出去了。这就是桥梁模式。
桥梁模式的本质还是解耦,它是为解决继承的缺点而提出的设计模式。
三、怎么样(举例)
1) 定义抽象者
/** * 桥梁模式将抽象和实现解耦, 它是为解决继承的缺点而提出的设计模式 * @author TimFruit * @date 2019/6/25 16:22 */ public abstract class Abstraction { protected Implementor implementor; public Abstraction(Implementor implementor) { // 通过构造参数注入具体实现者, 提醒使用者该抽象依赖于具体实现化角色 this.implementor = implementor; } public void operation(){ System.out.println("部分公共方法操作..."); // 具体实现化角色,可以只实现整体方法中的部分逻辑 this.implementor.operationImpl(); } }
2) 重定义抽象者
public class RefinedAbstraction extends Abstraction { public RefinedAbstraction(Implementor implementor) { super(implementor); } }
3) 定义实现者接口
public interface Implementor { void operationImpl(); }
4) 具体实现者
public class ConcreteImplementorA implements Implementor { @Override public void operationImpl() { System.out.println("A具体实现..."); } }
public class ConcreteImplementorB implements Implementor { @Override public void operationImpl() { System.out.println("B具体实现..."); } }
5)场景测试类
public class Client { public static void main(String[] args) { Implementor implementorA=new ConcreteImplementorA(); Abstraction abstractionA=new RefinedAbstraction(implementorA); abstractionA.operation(); Implementor implementorB=new ConcreteImplementorB(); Abstraction abstractionB=new RefinedAbstraction(implementorB); abstractionB.operation(); } }
6) 结果
部分公共方法操作...
A具体实现...
部分公共方法操作...
B具体实现...
四、注意事项
使用该模式主要考虑拆分抽象和实现. 它的意图还是对变化的封装, 尽可能把可能变化的因素封装到最细丶最小的逻辑. 当继承有n层继承的时候, 可以考虑该模式.
学习资料:
<设计模式之禅>