zoukankan      html  css  js  c++  java
  • 设计模式之桥接模式

    定义(百度百科):
          将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。

    UML类图:

    具体的代码:

    public class Client {
        @Test
        public void testBridge() {
            Implementor impl = new ConcreteImplementor();
            Abstraction refinedAbstraction = new RefinedAbstraction();
            refinedAbstraction.setImpl(impl);
            refinedAbstraction.operation();
        }
    }
    
    public abstract class Abstraction {
        protected Implementor impl;
    
        public void setImpl(Implementor impl) {
            this.impl=impl;
        }
    
        public abstract void operation();
    }
    
    public class RefinedAbstraction extends Abstraction {
    
        @Override
        public void operation() {
            impl.operation();
        }
    }
    
    public interface Implementor {
        void operation();
    }
    
    public class ConcreteImplementor implements Implementor {
    
        @Override
        public void operation() {
            System.out.println("实际应用");
        }
    }

    模块说明:

    Abstraction:定义抽象类的接口。
                       维护一个指向Implementor类型对象的引用。
    RefinedAbstraction:
                      扩充由Abstraction定义的接口。
    Implementor:
                      定义实现类的接口,该接口不一定要与Abstraction的接口完全一致,事实上这两个
                      接口可以完全不同。一般来讲, Implementor接口仅提供基本操作,而Abstraction则
                      定义了基于这些基本操作的较高层次的操作。
    ConcreteImplementor:
                      实现Implementor接口并定义它的具体实现。

    具体例子:
           网络上有个例子我觉得很不错,分享到这里,画画可以选择蜡笔和毛笔,如果每种笔分为大中小三个型号,并且有12种颜色
    那达到同样的需求,蜡笔的话就是12颜色*3种型号,36支笔,毛笔需要12个染色盒和3支不同型号的毛笔,共15只笔,
    如果哪天需要新增一种型号的笔,超大号,那蜡笔需要新增12支,毛笔只需要新增1支。
    多维度变化,这样的例子桥接模式就很合适了。

    应用场景:
    引用《研磨设计模式》这本书的一张图如下

    优缺点:
    优点:
    分离抽象和实现部分(面向抽象编程)
    更有效减少类的个数,更好的扩展性(就像上面的例子,新增一种型号的笔就可以了)

    缺点:
    桥接模式,会增加系统设计的难度,并且对抽象要求很高。
    桥接模式要求正确识别出两个独立变化的维度,因此其使用范围具有一定的局限性,如何正确识别两个独立维度也是不易的

    总结:桥接的本质就是,区分维度分离抽象和实现

  • 相关阅读:
    JZOJ 3034. 【NOIP2012模拟10.17】独立集
    JZOJ 3035. 【NOIP2012模拟10.17】铁轨
    JZOJ 1259. 牛棚安排
    数位DP JZOJ 3316. 非回文数字
    JZOJ 3046. 游戏
    JZOJ 3013. 填充棋盘
    debian 安装oracle提供的java8
    java 汉字转拼音 PinYin4j
    debian ssh设置root权限登陆 Permission denied, please try again
    java并发下订单生成策略
  • 原文地址:https://www.cnblogs.com/daily-note/p/7151320.html
Copyright © 2011-2022 走看看