zoukankan      html  css  js  c++  java
  • php模式设计之 适配器模式

    什么时候会用到适配器模式?

    • 其实最简单的例子是当我们引用一个第三方类库。这个类库随着版本的改变,它提供的API也可能会改变。如果很不幸的是,你的应用里引用的某个API已经发生改变的时候,除了在心中默默地骂“wocao”之外,你还得去硬着头皮去改大量的代码。
    • 难道真的一定要如此吗?按照套路来说,我会回答“不是的”。我们有适配器模式啊~~
    • 当接口发生改变时,适配器模式就派上了用场。

    代码参考

    <?php
    abstract class Toy  
    {  
        public abstract function openMouth();  
      
        public abstract function closeMouth();  
    }  
      
    class Dog extends Toy  
    {  
        public function openMouth()  
        {  
            echo "Dog open Mouth
    ";  
        }  
      
        public function closeMouth()  
        {  
            echo "Dog close Mouth
    ";  
        }  
    }  
      
    class Cat extends Toy  
    {  
        public function openMouth()  
        {  
            echo "Cat open Mouth
    ";  
        }  
      
        public function closeMouth()  
        {  
            echo "Cat close Mouth
    ";  
        }  
    }
    
    
    //目标角色:红枣遥控公司  
    interface RedTarget  
    {  
        public function doMouthOpen();  
      
        public function doMouthClose();  
    }  
      
    //目标角色:绿枣遥控公司及  
    interface GreenTarget  
    {  
        public function operateMouth($type = 0);  
    }
    
    
    //类适配器角色:红枣遥控公司  
    class RedAdapter implements RedTarget  
    {  
        private $adaptee;  
      
        function __construct(Toy $adaptee)  
        {  
            $this->adaptee = $adaptee;  
        }  
      
        //委派调用Adaptee的sampleMethod1方法  
        public function doMouthOpen()  
        {  
            $this->adaptee->openMouth();  
        }  
      
        public function doMouthClose()  
        {  
            $this->adaptee->closeMouth();  
        }  
    }  
      
    //类适配器角色:绿枣遥控公司  
    class GreenAdapter implements GreenTarget  
    {  
        private $adaptee;  
      
        function __construct(Toy $adaptee)  
        {  
            $this->adaptee = $adaptee;  
        }  
      
        //委派调用Adaptee:GreenTarget的operateMouth方法  
        public function operateMouth($type = 0)  
        {  
            if ($type) {  
                $this->adaptee->openMouth();  
            } else {  
                $this->adaptee->closeMouth();  
            }  
        }  
    }
    
    
    
    class testDriver  
    {  
        public function run()  
        {  
             //实例化一只狗玩具  
            $adaptee_dog = new Dog();  
            echo "给狗套上红枣适配器
    ";  
            $adapter_red = new RedAdapter($adaptee_dog);  
            //张嘴  
            $adapter_red->doMouthOpen();  
            //闭嘴  
            $adapter_red->doMouthClose();  
            echo "给狗套上绿枣适配器
    ";  
            $adapter_green = new GreenAdapter($adaptee_dog);  
            //张嘴  
            $adapter_green->operateMouth(1);  
            //闭嘴  
            $adapter_green->operateMouth(0);  
        }  
    }  
      
    $test = new testDriver();  
    $test->run();
    
    正因为来之不易,所以才有了后来的倍加珍惜。
  • 相关阅读:
    【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)
    【洛谷 P4289】[HAOI2008]移动玩具(搜索)
    【洛谷 SP283】NAPTIME
    【洛谷 P4342】[IOI1998]Polygon(DP)
    【洛谷 SP2878】Knights of the Round Table(双联通分量)
    【洛谷 P4168】[Violet]蒲公英(分块)
    【洛谷 P4180】【模板】严格次小生成树[BJWC2010](倍增)
    数学总结
    个人码风
    【洛谷 P3304】[SDOI2013]直径(树的直径)
  • 原文地址:https://www.cnblogs.com/jjxhp/p/9934588.html
Copyright © 2011-2022 走看看