• Bridge Design Pattern


    这篇博文是阅读老外写的博文后,自己参照了他的思想实现的PHP版本。若有不足,请善意指正。原文链接。

    请看如下的图片:

       

            吊扇和灯泡,2个电子设备。

      

                          2个开关,一个普通的,一个时尚的。

    开关可以用来控制电子设备的开和关。不管你用普通的开关还是时尚的开关,它都能控制电子设备的开关。

    或许这是废话,可很多事情都是从简单的概念开始的,比如我们学英文,先从26个字母开始,然后学习单词,等我们积累了一定单词的时候,我们利用各种介词和连接词把单词拼接在一起形成有意义的句子, I want(动词) to(介词) learn programming.

    如果你需要着手写作一本书的话,你需要把它拆分成章节,每个章节又细分为小节,每个小节的内容和写作技巧可能又有些不同。每个章节可能有内容的交叉,也有内容的延续和深入。

    可这些跟编程有关系吗?  

    答案是有的,这26个单词就相当于OOP的那些基本概念。我开始把那些常用的操作打包成自己的类库,在每个相似地场景运用它们。那是我学会了如何写小作文了。我已经掌握了大部分单词的写法,也能根据一定规则把它们组合在一起,形成有意义地句子。

    可如果我想写本书,还有很多东西等待我去学习和练习。

    言归正传,回到开关这个话题。是的,开关和电子设备是通过电子线路连接的,所以不管是时尚的开关或普通的开关,都能开关电灯。在编程的世界里,我们需要抽象这些概念,我们需要一个虚拟地电子线路来连接虚拟地电子设备和虚拟地开关。我画了个图来说明:

     Fan 风扇  Light 灯

    我定义了一个抽象的接口 IElectrinicalEquipment , 含有2个方法,开,关。

    Fan,Light 继承IElectrinicalEquipment 接口。

    还有一个抽象类 Switch(代码中ElectrinicalSwitch)

    NomalSwitch,FancySwitch 继承了这个抽象类的方法。

    等等,这些是什么呢? 看代码吧。

    <?php
    /**
     * 
     * 电子设备的基本功能接口
     * 所有设备都能开关
     *
     */
    interface IElectrinicalEquipment
    {
        public function PowerOn();
        public function PowerOff();
    }
    
    /**
     * 
     * 电子设备的开关抽象类
     * 实现的有点SB
     * 原作者是使用JAVA实现的,实现方法不是很懂。
     * todo:优化
     */
    abstract class ElectrinicalSwitch
    {
        public $bridge = null;
        
        function On(){
            $this->bridge->PowerOn();
        }
        function Off(){
            $this->bridge->PowerOff();
        }
    }
    
    /**
     * 
     * 2个具体开关类继承开关抽象类
     * 没有方法,简单
     *
     */
    class FancySwitch extends ElectrinicalSwitch
    {
    }
    
    class NomalSwitch extends ElectrinicalSwitch
    {
    }
    
    /**
     * 
     * 风扇类
     *
     */
    class fan implements IElectrinicalEquipment
    {
        public function PowerOn()
        {
            echo __CLASS__." switch on equipment<br />";
        }
        
        public function PowerOff()
        {
            echo __CLASS__." switch off equipment<br />";
        }
    }
    
    /**
     *
     * 灯类
     *
     */
    class light implements IElectrinicalEquipment
    {
        public function PowerOn()
        {
            echo __CLASS__." switch on equipment<br />";
        }
    
        public function PowerOff()
        {
            echo __CLASS__." switch off equipment<br />";
        }
    }
    
    $fan = new fan(); // 创建一个风扇
    $light = new light(); // 创建一个灯
    
    $nomal = new NomalSwitch(); // 创建一个普通开关
    $nomal->bridge = $fan;    // 将普通开关连上风扇
    $nomal->On();           // 打开风扇
    
    // 你可以自己控制试试
    ?>

    是不是很简单,学习这个模式的优点很多:

    • It teaches how to think abstract, which is the key concept of all Object Oriented Design Patterns.
    • It implements the basic OOD principles.
    • It is easy to understand.
    • If this pattern is understood correctly, learning other Design Patterns becomes easy.

    翻译过来就是:

    1. 它教会我们如何去思考抽象这个面向对象设计的最重要的概念。

    2.它实施了最基本的面向对象设计的原则。

    3.它非常容易理解。

    4.如果你理解了这个设计模式,学习其他的设计模式会变得很容易。

    附上作者的原UML模式图:

    Here, Abstraction is the base Switch class. RefinedAbstraction is the specific switch classes (FancySwitch,NormalSwitch etc.). Implementor is the IElectricalEquipment interface. ConcreteImplementorA andConcreteImplementorB are the Fan and Light classes.

    这个模式图与代码中类的对应关系:

    Abstraction --------- ElectrinicalSwitch 

    RefinedAbstraction ---------- FancySwitch,NormalSwitch 等.

    Implementor ------- IElectricalEquipment

    ConcreteImplementorA andConcreteImplementorB -------- Fan and Light 类

    如果我对这个设计模式的表述让你不明白,请查看原文,或留言讨论。

  • 相关阅读:
    C# 判断系统空闲(键盘、鼠标不操作一段时间)
    c#做动态(gif)中文验证码
    vue 移动端公众号采坑经验
    git常用命令汇总
    关于面试的相关问题
    jQuery请求后台接口
    谈谈前端行业一两点
    JQuery获取Dom元素的方法
    Vue--props
    函数的上下文就是函数里面的this是谁
  • 原文地址:https://www.cnblogs.com/arist/p/2855362.html
Copyright © 2020-2023  润新知