学习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的无限分类实现想法~
Jan 02 PHP
PHP 数组遍历方法大全(foreach,list,each)
Jun 30 PHP
php 批量查询搜狗sogou代码分享
May 17 PHP
PHP模板引擎Smarty内建函数详解
Apr 11 PHP
PHP中字符与字节的区别及字符串与字节转换示例
Oct 15 PHP
php中namespace及use用法分析
Dec 06 PHP
PHP实现支付宝即时到账功能
Dec 21 PHP
PHP+JQUERY操作JSON实例
Mar 23 PHP
php post json参数的传递和接收处理方法
May 31 PHP
PHP swoole和redis异步任务实现方法分析
Aug 12 PHP
Laravel 错误提示本地化的实现
Oct 22 PHP
PHP中echo与print区别点整理
Mar 09 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+mysqli事务控制实现银行转账实例
2015/01/29 PHP
PHP调用Linux命令权限不足问题解决方法
2015/02/07 PHP
递归实现php数组转xml的代码分享
2015/05/14 PHP
php文件类型MIME对照表(比较全)
2016/10/07 PHP
Yii2框架中使用PHPExcel导出Excel文件的示例
2017/08/09 PHP
php使用array_chunk函数将一个数组分割成多个数组
2018/12/05 PHP
破除网页鼠标右键被禁用的绝招大全
2006/12/27 Javascript
javascript中length属性的探索
2011/07/31 Javascript
常用js字符串判断方法整理
2013/10/18 Javascript
JS替换字符串中字符即替换全部而不是第一个
2014/06/04 Javascript
javascript删除一个html元素节点的方法
2014/12/20 Javascript
浅析Bootstrap缩略图组件与警示框组件
2016/04/29 Javascript
关于微信中a链接无法跳转问题
2016/08/02 Javascript
原生js实现form表单序列化的方法
2018/08/02 Javascript
vuex实现及简略解析(小结)
2019/03/01 Javascript
多个vue子路由文件自动化合并的方法
2019/09/03 Javascript
vue.js循环radio的实例
2019/11/07 Javascript
Python实现的概率分布运算操作示例
2017/08/14 Python
Python操作Oracle数据库的简单方法和封装类实例
2018/05/07 Python
解决python线程卡死的问题
2019/02/18 Python
详解pandas删除缺失数据(pd.dropna()方法)
2019/06/25 Python
python获取txt文件词向量过程详解
2019/07/05 Python
解决tensorflow由于未初始化变量而导致的错误问题
2020/01/06 Python
Python 列表的清空方式
2020/01/13 Python
Python如何使用paramiko模块连接linux
2020/03/18 Python
python怎么对数字进行过滤
2020/07/05 Python
纯CSS3制作漂亮带动画效果的主机价格表
2015/04/25 HTML / CSS
关于canvas绘制模糊问题的解决方法
2019/09/24 HTML / CSS
国际鲜花速递专家:Floraqueen
2016/11/24 全球购物
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
Lookfantastic法国官网:英国知名美妆购物网站
2017/10/28 全球购物
英国领先的瓷砖专家:Walls and Floors
2018/04/27 全球购物
欢度春节标语
2014/07/01 职场文书
青年教师师德演讲稿
2014/08/26 职场文书
人事部:年度述职报告范文
2019/07/12 职场文书
浅谈Laravel中使用Slack进行异常通知
2021/05/29 PHP