zoukankan      html  css  js  c++  java
  • 学习设计模式

    结构类 - 桥梁模式

    一、定义(是什么)

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

      

      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与模式》之桥梁模式

     

    人生没有彩排,每一天都是现场直播
  • 相关阅读:
    直方图
    Netty学习摘记 —— 初步认识Netty核心组件
    打败算法 —— 圆圈中最后剩下的数字
    打败算法 —— 单词的压缩编码
    大数据生态圈 —— 关于实时流处理的单节点伪分布式环境搭建
    打败算法 —— 按摩师
    打败算法 —— 最长公共子序列
    Spark学习摘记 —— Pair RDD行动操作API归纳
    Spark学习摘记 —— Pair RDD转化操作API归纳
    Spark学习摘记 —— RDD行动操作API归纳
  • 原文地址:https://www.cnblogs.com/timfruit/p/10138940.html
Copyright © 2011-2022 走看看