学习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 相关文章推荐
phpBB BBcode处理的漏洞
Oct 09 PHP
PHP 多维数组排序(usort,uasort)
Jun 30 PHP
基于preg_match_all采集后数据处理的一点心得笔记(编码转换和正则匹配)
Jan 31 PHP
ThinkPHP的URL重写问题
Jun 22 PHP
php中的字符编码转换函数用法示例
Oct 20 PHP
php查找指定目录下指定大小文件的方法
Nov 28 PHP
Codeigniter控制器controller继承问题实例分析
Jan 19 PHP
php+jquery+html实现点击不刷新加载更多的实例代码
Aug 12 PHP
php实现文件管理与基础功能操作
Mar 21 PHP
PHP 二维关联数组根据其中一个字段排序(推荐)
Apr 04 PHP
PHP数据库操作三:redis用法分析
Aug 16 PHP
PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
May 23 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 gd2 上传图片/文字水印/图片水印/等比例缩略图/实现代码
2010/05/15 PHP
php防攻击代码升级版
2010/12/29 PHP
简单实现php上传文件功能
2017/09/21 PHP
用js自动判断浏览器分辨率的代码
2007/01/28 Javascript
jQuery 开天辟地入门篇一
2009/12/09 Javascript
js螺旋动画效果的具体实例
2013/11/15 Javascript
js实现的复制兼容chrome和IE
2014/04/03 Javascript
自定义百度分享的分享按钮
2015/03/18 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
2015/08/03 Javascript
js实现当前输入框高亮显示的方法
2015/08/19 Javascript
JavaScript判断数字是否为质数的方法汇总
2016/06/02 Javascript
three.js实现围绕某物体旋转
2017/01/25 Javascript
Jquery实现跨域异步上传文件总结
2017/02/03 Javascript
Angular 4.x中表单Reactive Forms详解
2017/04/25 Javascript
jQuery实现radio第一次点击选中第二次点击取消功能
2017/05/15 jQuery
Node.js中DNS模块学习总结
2018/02/28 Javascript
JavaScript常用数学函数用法示例
2018/05/14 Javascript
VUE : vue-cli中去掉路由中的井号#操作
2020/09/04 Javascript
基于postman获取动态数据过程详解
2020/09/08 Javascript
[03:39]2015国际邀请赛主赛事首日精彩回顾
2015/08/05 DOTA
[47:12]TFT vs Secret Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
深入理解Python中的内置常量
2017/05/20 Python
pyspark 读取csv文件创建DataFrame的两种方法
2018/06/07 Python
django删除表重建的实现方法
2019/08/28 Python
博柏利美国官方网站:Burberry美国
2020/11/19 全球购物
Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
2015/01/27 面试题
会计专业自荐信范文
2013/12/02 职场文书
京剧自荐信
2014/01/26 职场文书
机关办公室岗位职责
2014/04/16 职场文书
农行心得体会
2014/09/02 职场文书
企业党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
撤诉书怎么写
2015/05/19 职场文书
幼儿园教师心得体会范文
2016/01/21 职场文书
windows下快速安装nginx并配置开机自启动的方法
2021/05/11 Servers
python脚本框架webpy模板赋值实现
2021/11/20 Python
利用JavaScript写一个简单计算器
2021/11/27 Javascript