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

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

    适配器模式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/

  • 相关阅读:
    JavaScript正则表达式(四)
    JavaScript三元运算符以及运算符顺序
    JavaScript进制转换
    JavaScript赋值运算符和关系运算符
    JavaScript输出
    hadoop1.2.1的安装
    SSH免费登录
    使用java poi解析表格
    【深入理解JVM】:Java类继承关系中的初始化顺序
    解决yum安装mysql时Requires: libc.so.6(GLIBC_2.17)(64bit)
  • 原文地址:https://www.cnblogs.com/jiujuan/p/10296257.html
Copyright © 2011-2022 走看看