学习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设计聊天室步步通
Oct 09 PHP
php实现执行某一操作时弹出确认、取消对话框
Dec 30 PHP
PHP入门经历和学习过程分享
Apr 11 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
Jun 25 PHP
thinkphp的URL路由规则与配置实例
Nov 26 PHP
smarty表格换行实例
Dec 15 PHP
php读取文件内容到数组的方法
Mar 16 PHP
教你在header中隐藏php的版本信息
Aug 10 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
Dec 21 PHP
PHP操作Postgresql封装类与应用完整实例
Apr 24 PHP
PHP addAttribute()函数讲解
Feb 03 PHP
php中钩子(hook)的原理与简单应用demo示例
Sep 03 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
Mysql数据库操作类( 1127版,提供源码下载 )
2010/12/02 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
2019/05/08 PHP
Open and Print a Word Document
2007/06/15 Javascript
Extjs在exlipse中设置自动提示的方法
2010/04/07 Javascript
日历查询的算法 如何计算某一天是星期几
2012/12/12 Javascript
编写js扩展方法判断一个数组中是否包含某个元素
2013/11/08 Javascript
jquery获取form表单input元素值的简单实例
2016/05/30 Javascript
json对象与数组以及转换成js对象的简单实现方法
2016/06/24 Javascript
文件上传,iframe跨域数据提交的实现
2016/11/18 Javascript
jQuery实现导航回弹效果
2017/02/27 Javascript
Vue的百度地图插件尝试使用
2017/09/06 Javascript
jQuery 防止相同的事件快速重复触发方法
2018/02/08 jQuery
Node.js 路由的实现方法
2019/06/05 Javascript
vue-socket.io跨域问题有效解决方法
2020/02/11 Javascript
Vue如何循环提取对象数组中的值
2020/11/18 Vue.js
[05:31]干嘛呢兄弟!DOTA2 TI9语音轮盘部分出处
2019/05/14 DOTA
python写入中英文字符串到文件的方法
2015/05/06 Python
Python中将字典转换为XML以及相关的命名空间解析
2015/10/15 Python
Python Selenium Cookie 绕过验证码实现登录示例代码
2018/04/10 Python
pycharm配置pyqt5-tools开发环境的方法步骤
2019/02/11 Python
python3.6环境安装+pip环境配置教程图文详解
2019/06/20 Python
如何使用Flask-Migrate拓展数据库表结构
2019/07/24 Python
Python实现i人事自动打卡的示例代码
2020/01/09 Python
解决jupyter运行pyqt代码内核重启的问题
2020/04/16 Python
Python实现自动装机功能案例分析
2020/10/22 Python
Chupi官网:在爱尔兰手工制作的订婚、结婚戒指和精美珠宝
2020/09/28 全球购物
小学教师师德反思
2014/02/03 职场文书
函授大学生自我鉴定
2014/02/05 职场文书
六查六看个人剖析材料
2014/10/14 职场文书
中学教师个人总结
2015/02/10 职场文书
导游词范文
2015/02/13 职场文书
党风廉洁教育心得体会
2016/01/20 职场文书
python本地文件服务器实例教程
2021/05/02 Python
mysql的数据压缩性能对比详情
2021/11/07 MySQL
JavaScript执行机制详细介绍
2021/12/06 Javascript