学习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中的内存管理问题
Aug 31 PHP
浅析php过滤html字符串,防止SQL注入的方法
Jul 02 PHP
php面向对象中的魔术方法中文说明
Mar 04 PHP
PHP不用递归实现无限分级的例子分享
Apr 18 PHP
smarty模板局部缓存方法使用示例
Jun 17 PHP
php下pdo的mysql事务处理用法实例
Dec 27 PHP
php+mysql大量用户登录解决方案分析
Dec 29 PHP
php+ajax无刷新上传图片实例代码
Nov 17 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
Dec 07 PHP
Zend Framework教程之Zend_Registry对象用法分析
Mar 22 PHP
thinkphp5 migrate数据库迁移工具
Feb 20 PHP
php框架CodeIgniter使用redis的方法分析
Apr 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
Terran历史背景
2020/03/14 星际争霸
php heredoc和phpwind的模板技术使用方法小结
2008/03/28 PHP
基于php下载文件的详解
2013/06/02 PHP
PHP正则提取不包含指定网址的图片地址的例子
2014/04/21 PHP
php实现兼容2038年后Unix时间戳转换函数
2015/03/18 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
2016/09/22 PHP
完美解决Thinkphp3.2中插入相同数据的问题
2017/08/01 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
网站上面有这种切换效果
2006/06/26 Javascript
IE和Firefox下javascript的兼容写法小结
2008/12/10 Javascript
JavaScript 嵌套函数指向this对象错误的解决方法
2010/03/15 Javascript
js中的前绑定和后绑定详解
2013/08/01 Javascript
JS中判断null、undefined与NaN的方法
2014/03/24 Javascript
JS下载文件|无刷新下载文件示例代码
2014/04/17 Javascript
js操作输入框中选择内容兼容IE及其他主流浏览器
2014/04/22 Javascript
jquery处理页面弹出层查询数据等待操作实例
2015/03/25 Javascript
jquery+css3实现网页背景花瓣随机飘落特效
2015/08/17 Javascript
js剪切板应用clipboardData实例解析
2016/05/29 Javascript
js canvas实现简单的图像扩散效果
2020/06/28 Javascript
简易Vue评论框架的实现(父组件的实现)
2018/01/08 Javascript
微信小程序textarea层级过高(盖住其他元素)问题的解决办法
2019/03/04 Javascript
vue基础知识--axios合并请求和slot
2020/06/04 Javascript
[54:33]2018DOTA2亚洲邀请赛小组赛 A组加赛 Liquid vs Optic
2018/04/03 DOTA
[57:53]Secret vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python使用reportlab将目录下所有的文本文件打印成pdf的方法
2015/05/20 Python
python实现协同过滤推荐算法完整代码示例
2017/12/15 Python
Python基于递归算法求最小公倍数和最大公约数示例
2018/07/27 Python
浅谈Python traceback的优雅处理
2018/08/31 Python
python实现猜数游戏(保存游戏记录)
2020/06/22 Python
用Python进行websocket接口测试
2020/10/16 Python
python 实现一个简单的线性回归案例
2020/12/17 Python
美国面料纺织品商城:Fabric.com
2017/06/28 全球购物
EVE LOM英国官网:全世界最好的洁面膏
2017/10/30 全球购物
匈牙利墨盒和碳粉购买网站:CDRmarket
2018/04/14 全球购物
母亲节主题班会
2015/08/14 职场文书
pytorch 如何使用amp进行混合精度训练
2021/05/24 Python