PHP设计模式之适配器模式原理与用法分析


Posted in PHP onApril 25, 2018

本文实例讲述了PHP设计模式之适配器模式原理与用法。分享给大家供大家参考,具体如下:

一、什么是适配器模式

适配器模式有两种:类适配器模式和对象适配器模式。其中类适配器模式使用继承方式,而对象适配器模式使用组合方式。由于类适配器模式包含双重继承,而PHP并不支持双重继承,所以一般都采取结合继承和实现的方式来模拟双重继承,即继承一个类,同时实现一个接口。类适配器模式很简单,但是与对象适配器模式相比,类适配器模式的灵活性稍弱。采用类适配器模式时,适配器继承被适配者并实现一个接口;采用对象适配器模式时,适配器使用被适配者,并实现一个接口。

二、什么时候使用适配器模式

适配器模式的作用就是解决兼容性问题,如果需要通过适配(使用多重继承或组合)来结合两个不兼容的系统,那就使用适配器模式。

三、类适配器模式

以货币兑换为例:

<?php
/**
*  类适配器模式
*        以货币兑换为例
**/
//美元计算类
class DollarCalc
{
  private $dollar;
  private $product;
  private $service;
  public $rate = 1;
  public function requestCalc($product,$service)
  {
    $this->product = $product;
    $this->service = $service;
    $this->dollar = $this->product + $this->service;
    return $this->requestTotal();
  }
  public function requestTotal()
  {
    $this->dollar *= $this->rate;
    return $this->dollar;
  }
}
//欧元计算类
class EuroCalc
{
  private $euro;
  private $product;
  private $service;
  public $rate = 1;
  public function requestCalc($product,$service)
  {
    $this->product = $product;
    $this->service = $service;
    $this->euro = $this->product + $this->service;
    return $this->requestTotal();
  }
  public function requestTotal()
  {
    $this->euro *= $this->rate;
    return $this->euro;
  }
}
//欧元适配器接口
interface ITarget
{
  function requester();
}
//欧元适配器实现
class EuroAdapter extends EuroCalc implements ITarget
{
  public function __construct()
  {
    $this->requester();
  }
  function requester()
  {
    $this->rate = .8111;
    return $this->rate;
  }
}
//客户类
class Client
{
  private $euroRequest;
  private $dollarRequest;
  public function __construct()
  {
    $this->euroRequest = new EuroAdapter();
    $this->dollarRequest = new DollarCalc();
    $euro = "?";
    echo "Euros: $euro" . $this->makeAdapterRequest($this->euroRequest) . "<br />";
    echo "Dollars: $" . $this->makeDollarRequest($this->dollarRequest);
  }
  private function makeAdapterRequest(ITarget $req)
  {
    return $req->requestCalc(40,50);
  }
  private function makeDollarRequest(DollarCalc $req)
  {
    return $req->requestCalc(40,50);
  }
}
$client = new Client();
?>

运行结果:

Euros: ?72.999
Dollars: $90

四、对象适配器模式

以桌面环境转向移动环境为例:

<?php
/**
*  对象适配器模式
*         从桌面环境转向移动环境
**/
//桌面布局接口
interface IFormat
{
  public function formatCSS();
  public function formatGraphics();
  public function horizontalLayout();
}
//桌面布局类实现
class Desktop implements IFormat
{
  public function formatCSS()
  {
    //调用桌面布局CSS文件
  }
  public function formatGraphics()
  {
    //调用图片
  }
  public function horizontalLayout()
  {
    //桌面水平布局
  }
}
//移动布局接口
interface IMobileFormat
{
  public function formatCSS();
  public function formatGraphics();
  public function verticalLayout();
}
//移动布局类实现
class Mobile implements IMobileFormat
{
  public function formatCSS()
  {
    //调用移动布局CSS文件
  }
  public function formatGraphics()
  {
    //调用图片
  }
  public function verticalLayout()
  {
    //移动垂直布局
  }
}
//移动布局适配器
class MobileAdapter implements IFormat
{
  private $mobile;
  public function __construct(IMobileFormat $mobile)
  {
    $this->mobile = $mobile;
  }
  public function formatCSS()
  {
    $this->mobile->formatCSS();
  }
  public function formatGraphics()
  {
    $this->mobile->formatGraphics();
  }
  public function horizontalLayout()
  {
    $this->mobile->verticalLayout();
  }
}
//客户类
class Client
{
  private $mobile;
  private $mobileAdapter;
  public function __construct()
  {
    $this->mobile = new Mobile();
    $this->mobileAdapter = new MobileAdapter($this->mobile);
    $this->mobileAdapter->formatCSS();
    $this->mobileAdapter->formatGraphics();
    $this->mobileAdapter->horizontalLayout();
  }
}
$client = new Client();
?>

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php实现jQuery扩展函数
Oct 30 PHP
非常好用的两个PHP函数 serialize()和unserialize()
Feb 04 PHP
php变量范围介绍
Oct 15 PHP
PHP垃圾回收机制引用计数器概念分析
Jun 24 PHP
分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)
Jan 30 PHP
php去除换行(回车换行)的三种方法
Mar 26 PHP
PHP动态生成javascript文件的2个例子
Apr 11 PHP
Codeigniter校验ip地址的方法
Mar 21 PHP
ajax+php控制所有后台函数调用
Jul 15 PHP
详解PHP中websocket的使用方法
Sep 15 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
Oct 08 PHP
PHP命令Command模式用法实例分析
Aug 08 PHP
PHP设计模式之原型设计模式原理与用法分析
Apr 25 #PHP
PHP设计模式之单例模式原理与实现方法分析
Apr 25 #PHP
PHP设计模式之工厂方法设计模式实例分析
Apr 25 #PHP
原生php实现excel文件读写的方法分析
Apr 25 #PHP
PHP操作Redis常用技巧总结
Apr 24 #PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
Apr 24 #PHP
PHP操作Postgresql封装类与应用完整实例
Apr 24 #PHP
You might like
php+mysql不用递归实现的无限级分类实例(非递归)
2014/07/08 PHP
cakephp打印sql语句的方法
2015/02/13 PHP
经典PHP加密解密函数Authcode()修复版代码
2015/04/05 PHP
PHP概率计算函数汇总
2015/09/13 PHP
php使用Jpgraph创建折线图效果示例
2017/02/15 PHP
YII框架中使用memcache的方法详解
2017/08/02 PHP
javascript iframe中打开文件,并检测iframe存在否
2008/12/28 Javascript
运用jquery实现table单双行不同显示并能单行选中
2009/07/25 Javascript
ext 同步和异步示例代码
2009/09/18 Javascript
判断js对象是否拥有某一个属性的js代码
2013/08/16 Javascript
php析构函数的具体用法小结
2014/03/11 Javascript
JavaScript window.location对象
2014/11/14 Javascript
javascript动态创建及删除元素的方法
2014/12/22 Javascript
js实现的四级左侧网站分类菜单实例
2015/05/06 Javascript
JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法
2016/08/03 Javascript
正则表达式替换html元素属性的方法
2016/11/26 Javascript
gulp教程_从入门到项目中快速上手使用方法
2017/09/14 Javascript
浅谈js的解析顺序 作用域 严格模式
2017/10/23 Javascript
基于JavaScript实现五子棋游戏
2020/08/26 Javascript
Angular实现的简单查询天气预报功能示例
2017/12/27 Javascript
如何快速解决JS或Jquery ajax异步跨域的问题
2018/01/08 jQuery
为什么Vue3.0使用Proxy实现数据监听(defineProperty表示不背这个锅)
2019/10/14 Javascript
十个Python程序员易犯的错误
2015/12/15 Python
Django中利用filter与simple_tag为前端自定义函数的实现方法
2017/06/15 Python
浅谈python之高阶函数和匿名函数
2019/03/21 Python
python pygame实现滚动横版射击游戏城市之战
2019/11/25 Python
CSS3旋转——彩色扇子兼容firefox浏览器
2013/06/04 HTML / CSS
JACK & JONES英国官方网站:欧洲领先的男装生产商
2017/09/27 全球购物
法国发饰品牌:Alexandre De Paris
2018/12/04 全球购物
广州御银科技股份有限公司试卷(C++)
2016/11/04 面试题
如何判断计算机可能已经中马
2013/03/22 面试题
运动会通讯稿500字
2014/02/20 职场文书
电子商务专业学生职业生涯规划
2014/03/07 职场文书
运动会广播稿200字
2015/08/19 职场文书
2019通用版劳动合同范本!
2019/07/11 职场文书
mysql的MVCC多版本并发控制的实现
2021/04/14 MySQL