学习设计模式 - 桥梁模式

结构类 - 桥梁模式

一、定义(是什么)

   将抽象和实现解耦,使得两者可以独立的变化

  

  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层继承的时候, 可以考虑该模式.

 

 

 学习资料:

  <设计模式之禅>

  《JAVA与模式》之桥梁模式

 

posted @ 2019-08-25 01:46  timfruit  阅读(201)  评论(0编辑  收藏  举报