• 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();
    
    正因为来之不易,所以才有了后来的倍加珍惜。
  • 相关阅读:
    成为一名全栈工程师
    【DocFX文档翻译】DocFX 入门 (Getting Started with DocFX)
    SharePoint 2013 项目部署
    dynamics crm跳转到手机版本的页面
    Azure中block和Page的比较 Azure: Did You Know? Block vs Page Blobs
    斐讯k1路由器刷Breed BootLoader(不死UBoot)教程
    DynamicsCRM中的自动保存
    Migrating an ASP.NET MVC application to ADFS authentication
    说一下最近一个月的面试体会吧
    Boss直聘快速导出简历为PDF的方法
  • 原文地址:https://www.cnblogs.com/jjxhp/p/9934588.html
Copyright © 2020-2023  润新知