学习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 相关文章推荐
也谈截取首页新闻 - 范例
Oct 09 PHP
PHP HTML代码串 截取实现代码
Jun 29 PHP
PHP中json_encode、json_decode与serialize、unserialize的性能测试分析
Jun 09 PHP
php-perl哈希算法实现(times33哈希算法)
Dec 30 PHP
php+xml编程之xpath的应用实例
Jan 24 PHP
PHP中is_dir()函数使用指南
May 08 PHP
php实现的简单美国商品税计算函数
Jul 13 PHP
php数组分页实现方法
Apr 30 PHP
Linux环境下php实现给网站截图的方法
May 03 PHP
制作个性化的WordPress登陆界面的实例教程
May 21 PHP
Smarty实现页面静态化(生成HTML)的方法
May 23 PHP
PHP中模糊查询并关联三个select框
Jun 19 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中通过ADODB库实现调用Access数据库之修正版本
2006/12/31 PHP
自动把纯文本转换成Web页面的php代码
2009/08/27 PHP
Laravel中使用FormRequest进行表单验证方法及问题汇总
2016/06/19 PHP
php 中的closure用法详解
2017/06/12 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
2018/05/28 PHP
Yii2.0框架模型多表关联查询示例
2019/07/18 PHP
javascript Zifa FormValid 0.1表单验证 代码打包下载
2007/06/08 Javascript
javascript multibox 全选
2009/03/22 Javascript
javascript document.referrer 用法
2009/04/30 Javascript
js动态给table添加/删除tr的方法
2013/08/02 Javascript
node.js中的buffer.slice方法使用说明
2014/12/10 Javascript
Javascript writable特性介绍
2015/02/27 Javascript
javascript解决IE6下hover问题的方法
2015/07/28 Javascript
JS实现自定义简单网页软键盘效果代码
2015/11/05 Javascript
JS匿名函数实例分析
2016/11/26 Javascript
JavaScript闭包和范围实例详解
2016/12/19 Javascript
Vue.js双向绑定操作技巧(初级入门)
2016/12/27 Javascript
canvas基础绘制-绚丽倒计时的实例
2017/09/17 Javascript
微信小程序授权登录解决方案的代码实例(含未通过授权解决方案)
2019/05/10 Javascript
微信小程序 调用微信授权窗口相关问题解决
2019/07/25 Javascript
vue+element实现图片上传及裁剪功能
2020/06/29 Javascript
浅谈vue中$event理解和框架中在包含默认值外传参
2020/08/07 Javascript
Python 字符串大小写转换的简单实例
2017/01/21 Python
详解Django之admin组件的使用和源码剖析
2018/05/04 Python
用Python实现将一张图片分成9宫格的示例
2019/07/05 Python
python被修饰的函数消失问题解决(基于wraps函数)
2019/11/04 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
2020/08/07 Python
Shop Apotheke瑞士:您的健康与美容网上商店
2019/10/09 全球购物
工商技校毕业生自荐信
2013/11/15 职场文书
自我评价个人范文
2013/12/16 职场文书
元旦活动感言
2014/03/08 职场文书
房屋继承公证书
2014/04/10 职场文书
工程材料采购方案
2014/05/18 职场文书
小学绿色学校申报材料
2014/08/23 职场文书
2014年学生资助工作总结
2014/12/18 职场文书
2016年元旦主持词
2015/07/06 职场文书