• 设计模式-适配器模式


    在我们平常用的手机充电器,就是一个适配器,它把我们日常使用的交流电通过手机充电器(适配器)转化成手机使用的直流电。

    适配器模式Adapter Pattern: (结构型模式)
    将一个接口转换为客户希望的另外一个接口,适配器模式使接口不兼容的那些类可以一起工作
    适配器别名又叫包装器 Wrapper。

    模式中的角色:
    1 目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。

    2 需要适配的类(Adaptee):需要适配的类或适配者类。

    3 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。

    示例:
    1: 使用继承模式

    <?php
    /*
    使用继承的适配器模式
    
    <?php
    class Adapter extends YourClass implements OtherInterface
    ?>
    */
    
    //已经实现了鲸鱼类
    class Whale
    {
        public function __construct() {
            $this->name = "Whale";
        }
    
        public function eatFish() {
            echo "whale eat fish. 
    ";
        }
    }
    //已经实现了鲤鱼类
    class Carp
    {
        public function __construct() {
            $this->name = "Carp";
        }
    
        public function eatMoss() {
            echo "Carp eat moss. 
    ";
        }
    }
    
    
    //现在要建一个动物馆
    interface Animal
    {
        function eatFish();
        function eatMoss();
    }
    
    //但是我们不能修改Whale 和 Carp类,于是用Adapter模式
    class WhaleAdapter extends Whale implements Animal
    {
        public function __construct() {
            $this->name = "Whale";
        }
        public function eatMoss() {
            echo "Whale do not eat moss. 
    ";
        }
    }
    
    class CarpAdapter extends Carp implements Animal
    {
        public function __construct() {
            $this->name = "Carp";
        }
    
        public function eatFish() {
            echo "Carp do not eat moss. 
    ";
        }
    }
    
    $whaleAdpter = new WhaleAdapter();
    $whaleAdpter->eatFish();
    $whaleAdpter->eatMoss();
    
    $carpAdapter = new CarpAdapter();
    $carpAdapter->eatFish();
    $carpAdapter->eatMoss();

    2:使用组件的适配器模式

    <?php
    /*
    使用组件的适配器模式
    
    */
    
    //已经实现了鲸鱼类
    class Whale
    {
        public function __construct() {
            $this->name = "Whale";
        }
    
        public function eatFish() {
            echo "whale eat fish. 
    ";
        }
    }
    //已经实现了鲤鱼类
    class Carp
    {
        public function __construct() {
            $this->name = "Carp";
        }
    
        public function eatMoss() {
            echo "Carp eat moss. 
    ";
        }
    }
    
    //现在要建一个动物馆
    interface Animal 
    {
      function eatFish();
      function eatMoss();
    }
    
    class WhaleAdapter implements Animal
    {
        public function __construct() {
            $this->name = "Whale";
            $this->whale = new Whale();
        }
    
        public function eatFish() {
            $this->whale->eatFish();
        }
    
        public function eatMoss() {
            echo "Whale do not eat moss. 
    ";
        }
    }
    
    class CarpAdapter implements Animal
    {
        public function __construct() {
            $this->name = "Carp";
            $this->carp = new Carp();
        }
    
        public function eatFish() {
            echo "Carp do not eat moss. 
    ";
        }
    
        public function eatMoss() {
            $this->carp->eatMoss();
        }
    }
    
    $whaleAdpter = new WhaleAdapter();
    $whaleAdpter->eatFish();
    $whaleAdpter->eatMoss();
    
    $carpAdapter = new CarpAdapter();
    $carpAdapter->eatFish();
    $carpAdapter->eatMoss();

    来自:http://csprojectedu.com/2016/03/18/PHPDesignPatterns-10/

  • 相关阅读:
    《大道至简》读书笔记 第3篇
    《大道至简》读书笔记 第2篇
    返回一个二维整数数组中最大联通子数组的和(思路)
    《大道至简》读书笔记 第1篇
    给尊敬的王老师
    团队开发——冲刺2.g
    第一阶段冲刺的总结报告
    团队开发——冲刺2.f
    《人月神话》读书笔记 第3篇
    团队开发——冲刺2.e
  • 原文地址:https://www.cnblogs.com/jiujuan/p/10296257.html
Copyright © 2020-2023  润新知