学习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 相关文章推荐
WINDOWS下php5.2.4+mysql6.0+apache2.2.4+ZendOptimizer-3.3.0配置
Mar 28 PHP
php 网页游戏开发入门教程一(webgame+design)
Oct 26 PHP
php 短链接算法收集与分析
Dec 30 PHP
深入php多态的实现详解
Jun 09 PHP
如何使用FireFox插件FirePHP调试PHP
Jul 23 PHP
php中$美元符号与Zen Coding冲突问题解决方法分享
May 28 PHP
学习php设计模式 php实现策略模式(strategy)
Dec 07 PHP
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
Dec 23 PHP
thinkPHP+PHPExcel实现读取文件日期的方法(含时分秒)
Jul 07 PHP
PHP制作登录异常ip检测功能的实例代码
Nov 16 PHP
php对微信支付回调处理的方法
Aug 23 PHP
七种PHP开发环境搭建工具
Jun 28 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&amp;mysql(一)
2006/10/09 PHP
PHP实现MVC开发得最简单的方法――模型
2007/04/10 PHP
PHP单例模式是什么 php实现单例模式的方法
2016/05/14 PHP
PHP面向对象程序设计(OOP)之方法重写(override)操作示例
2018/12/21 PHP
javascript Excel操作知识点
2009/04/24 Javascript
jQuery-serialize()输出序列化form表单值的方法
2012/12/26 Javascript
jQuery实现等比例缩放大图片让大图片自适应页面布局
2013/10/16 Javascript
JQuery实现表格动态增加行并对新行添加事件
2014/07/30 Javascript
jQuery链使用指南
2015/01/20 Javascript
JavaScript中DOM详解
2015/04/13 Javascript
JavaScript多线程详解
2015/08/12 Javascript
Bootstrap嵌入jqGrid,使你的table牛逼起来
2016/05/05 Javascript
浅谈JavaScript正则表达式-非捕获性分组
2017/03/08 Javascript
使用jQuery ajaxupload插件实现无刷新上传文件
2017/04/23 jQuery
JS实现unicode和UTF-8之间的互相转换互转
2017/07/05 Javascript
小程序怎样让wx.navigateBack更好用的方法实现
2019/11/01 Javascript
使用Python生成XML的方法实例
2017/03/21 Python
python3+PyQt5重新实现QT事件处理程序
2018/04/19 Python
如何利用python查找电脑文件
2018/04/27 Python
超简单使用Python换脸实例
2019/03/27 Python
执行Python程序时模块报错问题
2020/03/26 Python
python和php学习哪个更有发展
2020/06/17 Python
分享全球十款超强HTML5开发工具
2014/05/14 HTML / CSS
可以在一个PHP文件里面include另外一个PHP文件两次吗
2015/05/22 面试题
党员公开承诺书
2014/03/25 职场文书
工业设计毕业生自荐信
2014/04/13 职场文书
交通事故一次性赔偿协议书范本
2014/11/02 职场文书
学籍证明模板
2014/11/21 职场文书
技术股东合作协议书
2014/12/02 职场文书
论文致谢词范文
2015/05/14 职场文书
党支部鉴定意见
2015/06/02 职场文书
导游词之南京栖霞山
2019/10/18 职场文书
详解JS ES6编码规范
2021/05/07 Javascript
原型和原型链 prototype和proto的区别详情
2021/11/02 Javascript
解析MySQL索引的作用
2022/03/03 MySQL
vue如何清除浏览器历史栈
2022/05/25 Vue.js