学习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中防止SQL注入实现代码
Feb 19 PHP
基于python发送邮件的乱码问题的解决办法
Apr 25 PHP
php stripslashes和addslashes的区别
Feb 03 PHP
php格式化日期和时间格式化示例分享
Feb 24 PHP
JS异常处理try..catch语句的作用和实例
May 05 PHP
PHP 前加at符合@的作用解析
Jul 31 PHP
必须收藏的php实用代码片段
Feb 02 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
Aug 17 PHP
Smarty模板常见的简单应用分析
Nov 15 PHP
PHP hebrev()函数用法讲解
Feb 21 PHP
PHP实现微信提现(企业付款到零钱)
Aug 01 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
Dec 20 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表单重复提交实现方法
2015/09/29 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
Laravel ORM 数据model操作教程
2019/10/21 PHP
javascript 静态对象和构造函数的使用和公私问题
2010/03/02 Javascript
人人网javascript面试题 可以提前实现下
2012/01/05 Javascript
js冒泡、捕获事件及阻止冒泡方法详细总结
2014/05/08 Javascript
解决checkbox的attr(checked)一直为undefined问题
2014/06/16 Javascript
JS实现仿Windows经典风格的选项卡Tab切换代码
2015/10/20 Javascript
BootStrap+Angularjs+NgDialog实现模式对话框
2016/08/24 Javascript
Vue.js展示AJAX数据简单示例讲解
2017/03/29 Javascript
AngularJS实现的输入框字数限制提醒功能示例
2017/10/26 Javascript
vue router-link传参以及参数的使用实例
2017/11/10 Javascript
利用JS判断客户端类型你应该知道的四种方法
2017/12/22 Javascript
js将当前时间格式化为 年-月-日 时:分:秒的实现代码
2018/01/20 Javascript
Node.js静态服务器的实现方法
2018/02/28 Javascript
傻瓜式vuex语法糖kiss-vuex整理
2018/12/21 Javascript
python虚拟环境 virtualenv的简单使用
2020/01/21 Javascript
解决vue-router路由拦截造成死循环问题
2020/08/05 Javascript
Python常用时间操作总结【取得当前时间、时间函数、应用等】
2017/05/11 Python
pip安装时ReadTimeoutError的解决方法
2018/06/12 Python
python 格式化输出百分号的方法
2019/01/20 Python
在Python中通过getattr获取对象引用的方法
2019/01/21 Python
详解python使用turtle库来画一朵花
2019/03/21 Python
使用Python轻松完成垃圾分类(基于图像识别)
2019/07/09 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
2019/10/23 Python
解决Tensorflow占用GPU显存问题
2020/02/03 Python
python如何实现读取并显示图片(不需要图形界面)
2020/07/08 Python
CSS3实现3D翻书效果
2016/06/20 HTML / CSS
如何在Cookie里面保存Unicode和国际化字符
2013/05/25 面试题
C#笔试题和英文面试题
2013/02/07 面试题
主管职责范文
2013/11/09 职场文书
亮化工程实施方案
2014/03/17 职场文书
2015年药品销售工作总结范文
2015/05/25 职场文书
公司车辆维修管理制度
2015/08/05 职场文书
python 下载文件的几种方式分享
2021/04/07 Python
python批量更改目录名/文件名的方法
2021/04/18 Python