目录

【案例】

<红枣遥控公司来了>

<实现分析>

<程序猿的代码实现红枣遥控公司需求>

【分析OOA】

【设计OOD】

说明>

<代码>


【案例】

黑枣玩具公司专门生产玩具,生产的玩具不限于狗、猫、狮子,鱼等动物。每个玩具都可以进行“张嘴”与“闭嘴”操作,分别调用了openMouth与closeMouth方法。


abstract class Toy
{public abstract function openMouth();public abstract function closeMouth();
}class Dog extends Toy
{public function openMouth(){echo "Dog open Mouth\n";}public function closeMouth(){echo "Dog open Mouth\n";}
}class Cat extends Toy
{public function openMouth(){echo "Cat open Mouth\n";}public function closeMouth(){echo "Cat open Mouth\n";}
}

<红枣遥控公司来了>

黑枣玩具公司与红枣遥控公司合作,红枣遥控公司可以使用遥控设备对动物进行嘴巴控制。不过红枣遥控公司的遥控设备是调用的动物的doMouthOpen及doMouthClose方法。黑枣玩具公司的程序员现在必须要做的是对Toy系列类进行升级改造,使Toy能调用doMouthOpen及doMouthClose方法.

<实现分析>

这不是相当简单么,为Toy再增加doMouthOpen及doMouthClose方法,修改Dog类、Cat类等并实现doMouthOpen及doMouthClose方法就可以了。虽然有点小繁琐,工程量还不大。

<程序猿的代码实现红枣遥控公司需求>

bstract class Toy
{public abstract function openMouth();public abstract function closeMouth();//为红枣遥控公司控制接口增加doMouthOpen方法public abstract function doMouthOpen();//为红枣遥控公司控制接口增加doMouthClose方法public abstract function doMouthClose();
}class Dog extends Toy
{public function openMouth(){echo "Dog open Mouth\n";}public function closeMouth(){echo "Dog open Mouth\n";}//增加的方法public function doMouthOpen(){$this->doMouthOpen();}//增加的方法public function doMouthClose(){$this->closeMouth();}
}class Cat extends Toy
{public function openMouth(){echo "Cat open Mouth\n";}public function closeMouth(){echo "Cat open Mouth\n";}//增加的方法public function doMouthOpen(){$this->doMouthOpen();}//增加的方法public function doMouthClose(){$this->closeMouth();}
}

后面如果还有其他栆类公司来,增加的方法就会不断的变多。

【分析OOA】

我们可以开发,Toy系列类是越来也庞大。紫枣青枣黄枣山枣这些遥控公司全来的时候,总有一天系统会崩溃。

问题出在哪里。代码实现违反了“开-闭”原则,一个软件实体应当对扩展开放,对修改关闭。即在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。

重新设计代码,使用适配器模式来实现。

适配器模式核心思想:把对某些相似的类的操作转化为一个统一的“接口”(这里是比喻的说话)--适配器,或者比喻为一个“界面”,统一或屏蔽了那些类的细节。适配器模式还构造了一种“机制”,使“适配”的类可以很容易的增减,而不用修改与适配器交互的代码,符合“减少代码间耦合”的设计原则。

【设计OOD】

<UML>

说明>

  1. 目标(Target)角色:定义客户端使用的与特定领域相关的接口,这也就是我们所期待得到的

这里的RedTarget及GreenTarget分别为红枣公司及绿枣公司要求实现的相关接口。我们可以看到RedTarget必须实现doMouthOpen跟doMouthClose两个方法,GreenTarget必须实现opertateMouth一个方法就行了

  1. 源(Adaptee)角色:需要进行适配的接口

    这里的源角色是黑枣公司的Toy实例

  2. 适配器(Adapter)角色:对Adaptee的接口与Target接口进行适配;适配器是本模式的核心,适配器把源接口转换成目标接口,此角色为具体类

RedAdapter及GreenAdapter分别实现了RedTarget及GreenTarget接口,创建时接收一个Toy实例。

<代码>

  1. 源(Adaptee)角色:Toy系列类代码保持不变
abstract class Toy
{public abstract function openMouth();public abstract function closeMouth();
}class Dog extends Toy
{public function openMouth(){echo "Dog open Mouth\n";}public function closeMouth(){echo "Dog close Mouth\n";}
}class Cat extends Toy
{public function openMouth(){echo "Cat open Mouth\n";}public function closeMouth(){echo "Cat close Mouth\n";}
}
  1. 目标(Target)角色接口
//目标角色:红枣遥控公司
interface RedTarget
{public function doMouthOpen();public function doMouthClose();
}//目标角色:绿枣遥控公司及
interface GreenTarget
{public function operateMouth($type = 0);
}

3.适配器角色代码实现

//类适配器角色:红枣遥控公司
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();}}
}

测试用例Test Case】

class testDriver
{public function run(){//实例化一只狗玩具$adaptee_dog = new Dog();echo "给狗套上红枣适配器\n";$adapter_red = new RedAdapter($adaptee_dog);//张嘴$adapter_red->doMouthOpen();//闭嘴$adapter_red->doMouthClose();echo "给狗套上绿枣适配器\n";$adapter_green = new GreenAdapter($adaptee_dog);//张嘴$adapter_green->operateMouth(1);//闭嘴$adapter_green->operateMouth(0);}
}$test = new testDriver();
$test->run();

Php设计模式之【适配器模式 Adapter Pattern】相关推荐

  1. 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) 作者:webabcd 介绍 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本 ...

  2. 【设计模式】适配器模式 Adapter Pattern

    适配器模式在软件开发界使用及其广泛,在工业界,现实中也是屡见不鲜.比如手机充电器,笔记本充电器,广播接收器,电视接收器等等.都是适配器. 适配器主要作用是让本来不兼容的两个事物兼容和谐的一起工作.比如 ...

  3. 二十三种设计模式[6] - 适配器模式(Adapter Pattern)

    前言 适配器,属于类结构型模式.<设计模式 - 可复用的面向对象软件>一书中将之描述为" 将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类可 ...

  4. 【设计模式】—— 适配器模式Adapter

    模式意图 如果已经有了一种类,而需要调用的接口却并不能通过这个类实现.因此,把这个现有的类,经过适配,转换成支持接口的类. 换句话说,就是把一种现有的接口编程另一种可用的接口. 模式结构 [类的适配器 ...

  5. 设计模式(七): 通过转接头来观察适配器模式(Adapter Pattern)

    在前面一篇博客中介绍了"命令模式"(Command Pattern),今天博客的主题是"适配器模式"(Adapter Pattern).适配器模式用处还是比较多 ...

  6. 极速理解设计模式系列:6.适配器模式(Adapter Pattern)

    四个角色:目标抽象类角色(Target).目标对象角色(Adapter).源对象角色(Adaptee).客户端角色(Client) 目标抽象类角色(Target):定义需要实现的目标接口 目标对象角色 ...

  7. 适配器模式 Adapter Pattern

    适配器模式 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 这种模式涉及到一个单一的类,该类负责加入独立的 ...

  8. 『设计模式』适配器模式(Adapter)

    23种设计模式+额外常用设计模式汇总 (持续更新) 适配器模式(Adapter) 适配器模式把一一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作. ...

  9. C++设计模式之适配器模式(adapter)(结构型)

    一.结构型模式概述 结构型模式(Structural Pattern)描述如何将类或者对象结合在一起形成更大的结构,就像搭积木,可以通过简单积木的组合形成复杂的.功能更为强大的结构. 结构型模式可以分 ...

  10. php本地服务手机适配器,php适配器模式(adapter pattern)

    下午陪家人和小孩,晚上练起来. /* The adapter pattern allows the interface of an existing class to be used from ano ...

最新文章

  1. yield - python
  2. scrapy实现post请求与请求传参
  3. idea 设置导入包不带*
  4. Veil生成免杀payload 渗透win10 获取靶机shell
  5. 转换文档参数_明明2秒可以搞定Word、Excel相互转换,你却用了半小时!真亏了...
  6. 一文看懂PCA主成分分析
  7. c#winform演练 ktv项目 MediaPlayer控件播放音乐
  8. java读取request中的xml
  9. 一些忘记了的....
  10. 微波烹调,营养损失多or少?
  11. python矩阵乘法和转置_python简单实现矩阵的乘,加,转置和逆运算示例
  12. 玩赚亚丁号---薅羊毛专业版
  13. innography专利搜索与分析数据库
  14. 爱奇艺开源FASPell项目
  15. 编辑为什么建议转投_为何投文章总被拒?听听期刊编辑的干货建议
  16. PYTHON使用chinese_calendar判断日期是否为节假日
  17. 利用nslookup命令查看MX记录、A记录、CNAME记录和NS记录
  18. (转)ENVI端元提取(MNF→PPI→n-D Visualizer)
  19. 计算机操作系统--Linux初试05
  20. 【精益生产】精益知识大全

热门文章

  1. IT:成为服务经纪人的未来
  2. 队列--参考源码(转)
  3. java什么是适配器类?作用是什么?_软件设计模式之适配器模式(JAVA)
  4. 【LiteOS】HUAWEI LiteOS 详解
  5. carton num_Carton先生–世界上第一个卡通系列MadeWithUnity
  6. 谈一款MOBA类游戏《码神联盟》的服务端架构设计与实现 (转载)
  7. 智能音箱音效哪个好_2018最火4款智能音箱横评:哪款性价比最高?
  8. 前端面试笔试编程题(持续更新中)
  9. 魔影工厂 – 免费简单易用的全能视频格式转换工具
  10. NC15029 吐泡泡(解析与代码)