php适配器模式介绍


Posted in PHP onAugust 14, 2012

要点:

1. 适配器模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。

2. 适配器模式有对象适配器和类适配器两种形式的实现结构,但是类适配器采用“多继承”的实现方式,带来了不良的高耦合,所以一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。

实现:

php适配器模式介绍

类的适配器模式结构图(继承)

php适配器模式介绍

 

对象的适配器模式结构图(组合)

(对象适配器的代码实现)

Target:定义Client使用的与特定领域相关的接口

public interface Target { void request();}

 

Adaptee:现在需要适配的已经存在的接口

public class Adaptee{ public void specificRequest(){}}

 

Adapter:对Adaptee 的接口与Target接口进行适配

public class Adapter implements Target{ public Adapter(Adaptee adaptee) { super(); this.adaptee = adaptee; } public void request() { adaptee.specificRequest(); } private Adaptee adaptee;}

 

适用性:

1. 系统需要使用现有的类,而此类的接口不符合系统的需要。

2. 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。

3. (对对象适配器而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。

效果及优缺点:

对于类适配器:

1. 用一个具体的Adapter类对Adaptee和Taget进行匹配。结果是当我们想要匹配一个类以及所有它的子类时,类Adapter将不能胜任工作。

2. 使得Adapter可以override(重定义) Adaptee的部分行为,因为Adapter是Adaptee的一个子类。

对于对象适配器:

1. 允许一个Adapter与多个Adaptee,即Adaptee本身以及它的所有子类(如果有子类的话)同时工作。Adapter也可以一次给所有的Adaptee添加功能。

2. 使得override(重定义)Adaptee的行为比较困难。如果一定要override Adaptee的方法,就只好先做一个Adaptee的子类以override Adaptee的方法,然后再把这个子类当作真正的Adaptee源进行适配。

PHP 相关文章推荐
将RTF格式的文件转成HTML并在网页中显示的代码
Oct 09 PHP
php header()函数使用说明
Jul 10 PHP
PHP自定义函数收代码
Aug 01 PHP
《PHP编程最快明白》第三讲:php数组
Nov 01 PHP
php excel reader读取excel内容存入数据库实现代码
Dec 06 PHP
PHP中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
Feb 14 PHP
php的慢速日志引起的Mysql错误问题分析
May 13 PHP
ThinkPHP CURD方法之limit方法详解
Jun 18 PHP
PHP积分兑换接口实例
Feb 09 PHP
日常整理PHP中简单的图形处理(经典)
Oct 26 PHP
PHP实现163邮箱自动发送邮件
Mar 29 PHP
ThinkPHP实现附件上传功能
Apr 27 PHP
PHP缓存技术的多种方法小结
Aug 14 #PHP
PHP最常用的2种设计模式工厂模式和单例模式介绍
Aug 14 #PHP
php调用dll的实例操作动画与代码分享
Aug 14 #PHP
php中计算未知长度的字符串哪个字符出现的次数最多的代码
Aug 14 #PHP
PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
Aug 09 #PHP
通过5个php实例细致说明传值与传引用的区别
Aug 08 #PHP
php调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
Aug 08 #PHP
You might like
Ajax+PHP快速上手及简单应用说明
2013/07/24 PHP
PHP编写daemon process详解及实例代码
2016/09/30 PHP
struts2 jquery 打造无限层次的树
2009/10/23 Javascript
一些经常会用到的Javascript检测函数
2010/05/31 Javascript
js open() 与showModalDialog()方法使用介绍
2013/09/10 Javascript
使用jQuery的attr方法来修改onclick值
2014/07/07 Javascript
Javascript堆排序算法详解
2014/12/03 Javascript
jQuery中replaceWith()方法用法实例
2014/12/25 Javascript
jquery表单对象属性过滤选择器实例分析
2015/05/18 Javascript
JavaScript中的Math.atan2()方法使用详解
2015/06/15 Javascript
JS基于myFocus库实现各种功能的tab选项卡切换效果
2015/09/19 Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
2016/03/30 Javascript
基于jQuery的Web上传插件Uploadify使用示例
2016/05/19 Javascript
使用vue + less 实现简单换肤功能的示例
2018/02/21 Javascript
解决低版本的浏览器不支持es6的import问题
2018/03/09 Javascript
vue.js实现点击后动态添加class及删除同级class的实现代码
2018/04/04 Javascript
AngularJS 多指令Scope问题的解决
2018/10/25 Javascript
js+canvas实现图片格式webp/png/jpeg在线转换
2020/08/22 Javascript
python生成器的使用方法
2013/11/21 Python
跟老齐学Python之关于类的初步认识
2014/10/11 Python
Collatz 序列、逗号代码、字符图网格实例
2017/06/22 Python
Python3模拟登录操作实例分析
2019/03/12 Python
python使用pandas处理大数据节省内存技巧(推荐)
2019/05/05 Python
Python字典的概念及常见应用实例详解
2019/10/30 Python
python读取ini配置文件过程示范
2019/12/23 Python
Django-silk性能测试工具安装及使用解析
2020/11/28 Python
python中的时区问题
2021/01/14 Python
eDreams葡萄牙:全球最大的在线旅行社之一
2019/04/15 全球购物
DeinDesign德国:设计自己的手机壳
2019/12/14 全球购物
string = null 和string = ''的区别
2013/04/28 面试题
入党积极分子自我鉴定
2014/02/18 职场文书
幼儿教师培训感言
2014/03/08 职场文书
小学少先队活动总结
2015/05/08 职场文书
离职员工给领导和同事的感谢信
2015/11/03 职场文书
编写python程序的90条建议
2021/04/14 Python
你真的了解redis为什么要提供pipeline功能
2021/06/22 Redis