学习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实现与ASP Banner组件相似的类
Oct 09 PHP
给初学PHP的5个入手程序
Nov 23 PHP
基于PHP CURL用法的深入分析
Jun 09 PHP
利用phpexcel把excel导入数据库和数据库导出excel实现
Jan 09 PHP
php中mt_rand()随机数函数用法
Nov 24 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
Feb 15 PHP
PHP中使用foreach()遍历二维数组的简单实例
Jun 13 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
May 26 PHP
PHP编程实现阳历转换为阴历的方法实例
Aug 08 PHP
PHP+ajax实现二级联动菜单功能示例
Aug 10 PHP
laravel 多图上传及图片的存储例子
Oct 14 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
Oct 14 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版本实现代码
2012/09/15 PHP
zf框架db类的分页示例分享
2014/03/14 PHP
php使用imagick模块实现图片缩放、裁剪、压缩示例
2014/04/17 PHP
php生成图片缩略图的方法
2015/04/07 PHP
ext 代码生成器
2009/08/07 Javascript
js表格分页实现代码
2009/09/18 Javascript
JS仿淘宝实现的简单滑动门效果代码
2015/10/14 Javascript
jquery表单验证实例仿Toast提示效果
2017/03/03 Javascript
cropper js基于vue的图片裁剪上传功能的实现代码
2018/03/01 Javascript
解决Vue.js父组件$on无法监听子组件$emit触发事件的问题
2018/09/12 Javascript
Ant Design Vue 添加区分中英文的长度校验功能
2020/01/21 Javascript
Vue.js的模板语法详解
2020/02/16 Javascript
JS数组reduce()方法原理及使用技巧解析
2020/07/14 Javascript
[07:47]DOTA2国际邀请赛采访专栏:探访Valve总部
2013/08/08 DOTA
Python2.x版本中maketrans()方法的使用介绍
2015/05/19 Python
Python 3.x 新特性及10大变化
2015/06/12 Python
Python的Asyncore异步Socket模块及实现端口转发的例子
2016/06/14 Python
利用ctypes提高Python的执行速度
2016/09/09 Python
python脚本实现数据导出excel格式的简单方法(推荐)
2016/12/30 Python
详解Python中for循环是如何工作的
2017/06/30 Python
python虚拟环境的安装和配置(virtualenv,virtualenvwrapper)
2019/08/09 Python
python 利用jinja2模板生成html代码实例
2019/10/10 Python
使用Python制作新型冠状病毒实时疫情图
2020/01/28 Python
详解css3中的伪类before和after常见用法
2020/11/17 HTML / CSS
澳大利亚冒险体验:Adrenaline(跳伞、V8赛车、热气球等)
2017/09/18 全球购物
统计每一学生的平均成绩
2014/06/06 面试题
化学相关工作求职信
2013/10/02 职场文书
英语演讲稿范文
2014/01/03 职场文书
高校教师思想汇报
2014/01/11 职场文书
投资合作协议书
2014/04/17 职场文书
学校百日安全生产活动总结
2014/07/05 职场文书
报考公务员诚信承诺书
2014/08/29 职场文书
学校领导班子四风对照检查材料
2014/09/27 职场文书
优秀员工事迹材料
2014/12/20 职场文书
胡雪岩故居导游词
2015/02/06 职场文书
小学思想品德教学反思
2016/02/24 职场文书