学习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 相关文章推荐
Apache2 httpd.conf 中文版
Nov 17 PHP
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
Feb 16 PHP
php empty() 检查一个变量是否为空
Nov 10 PHP
在wamp集成环境下升级php版本(实现方法)
Jul 01 PHP
ThinkPHP实现跨模块调用操作方法概述
Jun 20 PHP
php使用fputcsv()函数csv文件读写数据的方法
Jan 06 PHP
Zend Framework框架路由机制代码分析
Mar 22 PHP
PHP中模糊查询并关联三个select框
Jun 19 PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
Jul 03 PHP
php+ajax实现仿百度查询下拉内容功能示例
Oct 20 PHP
RSA实现JS前端加密与PHP后端解密功能示例
Aug 05 PHP
PHP设计模式概论【概念、分类、原则等】
May 01 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
杏林同学录(一)
2006/10/09 PHP
php数组函数序列之array_sum() - 计算数组元素值之和
2011/10/29 PHP
php中使用PHPExcel读写excel(xls)文件的方法
2014/09/15 PHP
php实现用于删除整个目录的递归函数
2015/03/16 PHP
php类的扩展和继承用法实例
2015/06/20 PHP
php获取ajax的headers方法与内容实例
2017/12/27 PHP
phpstorm 配置xdebug的示例代码
2019/03/31 PHP
详细讲解JS节点知识
2010/01/31 Javascript
QUnit jQuery的TDD框架
2010/11/04 Javascript
jQuery+html5实现div弹出层并遮罩背景
2015/04/15 Javascript
JS简单生成两个数字之间随机数的方法
2016/08/03 Javascript
解决ztree搜索中多级菜单展示不全问题
2017/07/05 Javascript
js设置随机切换背景图片的简单实例
2017/11/12 Javascript
快速解决angularJS中用post方法时后台拿不到值的问题
2018/08/14 Javascript
解决Layui 表单提交数据为空的问题
2018/08/15 Javascript
Vue设置长时间未操作登录自动到期返回登录页
2020/01/22 Javascript
JS如何实现封装列表右滑动删除收藏按钮
2020/07/23 Javascript
浅析 Vue 3.0 的组装式 API(一)
2020/08/31 Javascript
JavaScript WeakMap使用详解
2021/02/05 Javascript
[35:43]2018DOTA2亚洲邀请赛 4.1 小组赛B组 paiN vs Effect
2018/04/03 DOTA
使用python实现baidu hi自动登录的代码
2013/02/10 Python
sqlalchemy对象转dict的示例
2014/04/22 Python
详解Python的Django框架中Manager方法的使用
2015/07/21 Python
PyQt5每天必学之QSplitter实现窗口分隔
2018/04/19 Python
Python实现调用另一个路径下py文件中的函数方法总结
2018/06/07 Python
Python 单元测试(unittest)的使用小结
2018/11/14 Python
python中的反斜杠问题深入讲解
2019/08/12 Python
opencv-python 提取sift特征并匹配的实例
2019/12/09 Python
python使用信号量动态更新配置文件的操作
2020/04/01 Python
英国安全产品购物网站:The Safe Shop
2017/03/20 全球购物
个性化皮包、小袋、生活配件:Mon Purse
2019/03/26 全球购物
公司财务人员岗位职责
2015/04/14 职场文书
趣味运动会通讯稿
2015/07/18 职场文书
教师岗位说明书
2015/09/30 职场文书
MySQL多表查询机制
2022/03/17 MySQL
vue 实现弹窗关闭后刷新效果
2022/04/08 Vue.js