学习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 相关文章推荐
用PHP将数据导入到Foxmail
Oct 09 PHP
简单的移动设备检测PHP脚本代码
Feb 19 PHP
php对大文件进行读取操作的实现代码
Jan 23 PHP
ini_set的用法介绍
Jan 07 PHP
PHP间隔一段时间执行代码的方法
Dec 02 PHP
PHP中返回引用类型的方法
Apr 03 PHP
如何解决PHP使用mysql_query查询超大结果集超内存问题
Mar 14 PHP
完美解决在ThinkPHP控制器中命名空间的问题
May 05 PHP
WHOOPS PHP调试库的使用
Sep 29 PHP
PHP迭代器接口Iterator用法分析
Dec 28 PHP
基于swoole实现多人聊天室
Jun 14 PHP
PHP实现限制域名访问的实现代码(本地验证)
Sep 13 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
php中使用preg_replace函数匹配图片并加上链接的方法
2013/02/06 PHP
适用于抽奖程序、随机广告的PHP概率算法实例
2014/04/09 PHP
ThinkPHP连接数据库的方式汇总
2014/12/05 PHP
PHP语法小结之基础和变量
2015/11/22 PHP
PHP基于GD库实现的生成图片缩略图函数示例
2017/07/05 PHP
ExtJS 简介 让你知道extjs是什么
2008/12/29 Javascript
基于jQuery的可以控制左右滚动及自动滚动效果的代码
2010/07/25 Javascript
JavaScript实现的日期控件具体代码
2013/11/18 Javascript
下拉列表select 由左边框移动到右边示例
2013/12/04 Javascript
javascript圆盘抽奖程序实现原理和完整代码例子
2014/06/03 Javascript
jQuery.prop() 使用详解
2015/07/19 Javascript
js实现向右横向滑出的二级菜单效果
2015/08/27 Javascript
基于jQuery日历插件制作日历
2016/03/11 Javascript
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
2017/06/05 Javascript
JS原生带小白点轮播图实例讲解
2017/07/22 Javascript
React-Native做一个文本输入框组件的实现代码
2017/08/10 Javascript
AngularJS实现图片上传和预览功能的方法分析
2017/11/08 Javascript
vue-router 手势滑动触发返回功能
2018/09/30 Javascript
详解微信小程序之提高应用速度小技巧
2020/01/07 Javascript
javascript设计模式 ? 享元模式原理与用法实例分析
2020/04/15 Javascript
JS图片预加载三种实现方法解析
2020/05/08 Javascript
js实现自定义右键菜单
2020/05/18 Javascript
JavaScript实现雪花飘落效果
2020/12/27 Javascript
Vue项目中使用mock.js的完整步骤
2021/01/12 Vue.js
[01:09]DOTA2次级职业联赛 - ishow.HMM战队宣传片
2014/12/01 DOTA
python回调函数中使用多线程的方法
2017/12/25 Python
python实现闹钟定时播放音乐功能
2018/01/25 Python
关于Python的一些学习总结
2018/05/25 Python
对numpy中数组转置的求解以及向量内积计算方法
2018/10/31 Python
python通过paramiko复制远程文件及文件目录到本地
2019/04/30 Python
完美解决keras保存好的model不能成功加载问题
2020/06/11 Python
python工具快速为音视频自动生成字幕(使用说明)
2021/01/27 Python
通用C#笔试题附答案
2016/11/26 面试题
领导班子四风表现材料
2014/08/23 职场文书
中学生教师节演讲稿
2014/09/03 职场文书
党员应该树立反腐倡廉的坚定意识思想汇报
2014/09/12 职场文书