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 相关文章推荐
mysql建立外键
Nov 25 PHP
php设计模式 Adapter(适配器模式)
Jun 26 PHP
PHP中使用unset销毁变量并内存释放问题
Jul 05 PHP
判断php数组是否为索引数组的实现方法
Jun 13 PHP
php与c 实现按行读取文件实例代码
Jan 03 PHP
php修改数组键名的方法示例
Apr 15 PHP
php数值转换时间及时间转换数值用法示例
May 18 PHP
Ubuntu彻底删除PHP7.0的方法
Jul 27 PHP
详解php命令注入攻击
Apr 06 PHP
laravel框架 laravel-admin上传图片到oss的方法
Oct 13 PHP
PHP $O00OO0=urldecode &amp; eval 解密,记一次商业源码的去后门
Sep 13 PHP
关于PHP数组迭代器的使用方法实例
Nov 17 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之Smarty入门
2007/01/04 PHP
PHP实现图片上传并压缩
2015/12/22 PHP
[原创]解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)
2016/06/22 PHP
php版微信公众账号第三方管理工具开发简明教程
2016/09/23 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
php封装的pdo数据库操作工具类与用法示例
2019/05/08 PHP
解决laravel id非自增 模型取回为0 的问题
2019/10/11 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
关于js中alert弹出窗口文本换行问题简单详细说明
2012/12/11 Javascript
js作用域及作用域链概念理解及使用
2013/04/15 Javascript
Javascript 遍历页面text控件详解
2014/01/06 Javascript
javascript监听鼠标滚轮事件浅析
2014/06/05 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
2015/05/08 Javascript
JS三级可折叠菜单实现方法
2016/02/29 Javascript
DWR中各种java方法的调用
2016/05/04 Javascript
jQuery插件Validation快速完成表单验证的方式
2016/07/28 Javascript
浅谈JavaScript 函数参数传递到底是值传递还是引用传递
2016/08/23 Javascript
js canvas仿支付宝芝麻信用分仪表盘
2016/11/16 Javascript
jquery实现简单的瀑布流布局
2016/12/11 Javascript
聊聊Vue.js的template编译的问题
2017/10/09 Javascript
ES6中异步对象Promise用法详解
2019/07/31 Javascript
JavaScript数组排序功能简单实现
2020/05/14 Javascript
Python3遍历目录树实现方法
2015/05/22 Python
详解Python多线程Selenium跨浏览器测试
2017/04/01 Python
使用python将mysql数据库的数据转换为json数据的方法
2019/07/01 Python
python 调试冷知识(小结)
2019/11/11 Python
Python turtle库的画笔控制说明
2020/06/28 Python
Notino芬兰:购买香水和化妆品
2019/04/15 全球购物
电气工程及自动化专业自荐书范文
2013/12/18 职场文书
五年级科学教学反思
2014/02/05 职场文书
献爱心活动总结
2014/05/07 职场文书
本科毕业生自荐信
2014/05/26 职场文书
商务经理岗位职责
2014/07/30 职场文书
学雷锋日活动总结
2015/02/06 职场文书
python 下划线的多种应用场景总结
2021/05/12 Python
CentOS7 minimal 最小化安装网络设置过程
2022/12/24 Servers