学习php设计模式 php实现适配器模式


Posted in PHP onDecember 07, 2015

一、意图
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原来由于接口不兼容而不能一起工作的那此类可以一起工作
二、适配器模式结构图

学习php设计模式 php实现适配器模式

学习php设计模式 php实现适配器模式

三、适配器模式中主要角色
目标(Target)角色:定义客户端使用的与特定领域相关的接口,这也就是我们所期待得到的
源(Adaptee)角色:需要进行适配的接口
适配器(Adapter)角色:对Adaptee的接口与Target接口进行适配;适配器是本模式的核心,适配器把源接口转换成目标接口,此角色为具体类
四、适配器模式适用场景
1、你想使用一个已经存在的类,而它的接口不符合你的需求
2、你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作
3、你想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口(仅限于对象适配器)
五、类适配器模式与对象适配器
类适配器:Adapter与Adaptee是继承关系
1、用一个具体的Adapter类和Target进行匹配。结果是当我们想要一个匹配一个类以及所有它的子类时,类Adapter将不能胜任工作
2、使得Adapter可以重定义Adaptee的部分行为,因为Adapter是Adaptee的一个子集
3、仅仅引入一个对象,并不需要额外的指针以间接取得adaptee
对象适配器:Adapter与Adaptee是委托关系
1、允许一个Adapter与多个Adaptee同时工作。Adapter也可以一次给所有的Adaptee添加功能
2、使用重定义Adaptee的行为比较困难
适配器模式与其它模式
桥梁模式(bridge模式):桥梁模式与对象适配器类似,但是桥梁模式的出发点不同:桥梁模式目的是将接口部分和实现部分分离,从而对它们可以较为容易也相对独立的加以改变。而对象适配器模式则意味着改变一个已有对象的接口
装饰器模式(decorator模式):装饰模式增强了其他对象的功能而同时又不改变它的接口。因此装饰模式对应用的透明性比适配器更好。
六、类适配器模式PHP示例
类适配器使用的是继承

<?php
/**
 * 目标角色
 */
interface Target {
 
  /**
   * 源类也有的方法1
   */
  public function sampleMethod1();
 
  /**
   * 源类没有的方法2
   */
  public function sampleMethod2();
}
 
/**
 * 源角色
 */
class Adaptee {
 
  /**
   * 源类含有的方法
   */
  public function sampleMethod1() {
    echo 'Adaptee sampleMethod1 <br />';
  }
}
 
/**
 * 类适配器角色
 */
class Adapter extends Adaptee implements Target {
 
  /**
   * 源类中没有sampleMethod2方法,在此补充
   */
  public function sampleMethod2() {
    echo 'Adapter sampleMethod2 <br />';
  }
 
}
 
class Client {
 
  /**
   * Main program.
   */
  public static function main() {
    $adapter = new Adapter();
    $adapter->sampleMethod1();
    $adapter->sampleMethod2();
 
  }
 
}
 
Client::main();
?>

七、对象适配器模式PHP示例
对象适配器使用的是委派

<?php
/**
 * 目标角色
 */
interface Target {
 
  /**
   * 源类也有的方法1
   */
  public function sampleMethod1();
 
  /**
   * 源类没有的方法2
   */
  public function sampleMethod2();
}
 
/**
 * 源角色
 */
class Adaptee {
 
  /**
   * 源类含有的方法
   */
  public function sampleMethod1() {
    echo 'Adaptee sampleMethod1 <br />';
  }
}
 
/**
 * 类适配器角色
 */
class Adapter implements Target {
 
  private $_adaptee;
 
  public function __construct(Adaptee $adaptee) {
    $this->_adaptee = $adaptee;
  }
 
  /**
   * 委派调用Adaptee的sampleMethod1方法
   */
  public function sampleMethod1() {
    $this->_adaptee->sampleMethod1();
  }
 
  /**
   * 源类中没有sampleMethod2方法,在此补充
   */
  public function sampleMethod2() {
    echo 'Adapter sampleMethod2 <br />';
  }
 
}
 
class Client {
 
  /**
   * Main program.
   */
  public static function main() {
    $adaptee = new Adaptee();
    $adapter = new Adapter($adaptee);
    $adapter->sampleMethod1();
    $adapter->sampleMethod2();
 
  }
 
}
 
Client::main();
?>

以上就是使用php实现适配器模式的代码,还有一些关于适配器模式的概念区分,希望对大家的学习有所帮助。

PHP 相关文章推荐
实用函数3
Nov 08 PHP
php header()函数使用说明
Jul 10 PHP
php设计模式 Interpreter(解释器模式)
Jun 26 PHP
PHP获取用户的浏览器与操作系统信息的代码
Sep 04 PHP
解析PHP中empty is_null和isset的测试
Jun 29 PHP
PHP实现AES256加密算法实例
Sep 22 PHP
php自定义时间转换函数示例
Dec 07 PHP
基于PHP实现的多元线性回归模拟曲线算法
Jan 30 PHP
php中文语义分析实现方法示例
Sep 28 PHP
laravel 获取某个查询的查询SQL语句方法
Oct 12 PHP
PHP字符串与数组处理函数用法小结
Jan 07 PHP
详解PHP服务器如何在有限的资源里最大提升并发能力
May 25 PHP
分享五个PHP7性能优化提升技巧
Dec 07 #PHP
学习php设计模式 php实现工厂模式(factory)
Dec 07 #PHP
学习php设计模式 php实现原型模式(prototype)
Dec 07 #PHP
PHP中Enum(枚举)用法实例详解
Dec 07 #PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
Dec 07 #PHP
学习php设计模式 php实现门面模式(Facade)
Dec 07 #PHP
php实现smarty模板无限极分类的方法
Dec 07 #PHP
You might like
附件名前加网站名
2008/03/23 PHP
php strlen mb_strlen计算中英文混排字符串长度
2009/07/10 PHP
如何判断php数组的维度
2013/06/10 PHP
PHP5多态性与动态绑定介绍
2015/04/03 PHP
微信开发之php表单微信中自动提交两次问题解决办法
2017/01/08 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
2017/01/16 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
2017/08/01 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
Visual Studio中的jQuery智能提示设置方法
2010/03/27 Javascript
JavaScript中使用构造函数实现继承的代码
2010/08/12 Javascript
jQuery实现table隔行换色和鼠标经过变色的两种方法
2014/06/15 Javascript
常用的jquery模板插件——jQuery Boilerplate介绍
2014/09/23 Javascript
node.js中的http.response.removeHeader方法使用说明
2014/12/14 Javascript
JavaScript中常用的六种互动方法示例
2015/03/13 Javascript
js实现的牛顿摆效果
2015/03/31 Javascript
jquery插件jSignature实现手动签名
2015/05/04 Javascript
JavaScript中几种排序算法的简单实现
2015/07/29 Javascript
js删除局部变量的实现方法
2016/06/25 Javascript
js实现数组内数据的上移和下移的实例
2017/11/14 Javascript
js中Array对象的常用遍历方法详解
2019/01/17 Javascript
layui复选框的全选与取消实现方法
2019/09/02 Javascript
react 生命周期实例分析
2020/05/18 Javascript
原生JS实现弹幕效果的简单操作指南
2020/11/10 Javascript
如何在vue中使用kindeditor富文本编辑器
2020/12/19 Vue.js
[01:51]2014DOTA2国际邀请赛 这个赛场没有失败者VGTi5再见
2014/07/23 DOTA
简单的通用表达式求10乘阶示例
2014/03/03 Python
python socket多线程通讯实例分析(聊天室)
2016/04/06 Python
Python中input与raw_input 之间的比较
2017/08/20 Python
python Elasticsearch索引建立和数据的上传详解
2019/08/04 Python
关于Python核心框架tornado的异步协程的2种方法详解
2019/08/28 Python
python 邮件检测工具mmpi的使用
2021/01/04 Python
HTML5混合开发二维码扫描以及调用本地摄像头
2017/12/27 HTML / CSS
小学元宵节活动总结
2015/02/06 职场文书
煤矿施工安全协议书
2016/03/22 职场文书
python blinker 信号库
2022/05/04 Python
java实现面板之间切换功能
2022/06/10 Java/Android