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 相关文章推荐
ob_start(),ob_start('ob_gzhandler')使用
Dec 25 PHP
PHP获取网卡地址的代码
Apr 09 PHP
php 在线打包_支持子目录
Jun 28 PHP
简单的php缓存类分享     php缓存机制
Jan 22 PHP
php中常量DIRECTORY_SEPARATOR用法深入分析
Nov 14 PHP
PHP里8个鲜为人知的安全函数分析
Dec 09 PHP
PHP贪婪算法解决0-1背包问题实例分析
Mar 23 PHP
PHP实现HTTP断点续传的方法
Jun 17 PHP
使用PHP similar text计算两个字符串相似度
Nov 06 PHP
mysql_escape_string()函数用法分析
Apr 25 PHP
PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法
Jun 20 PHP
Laravel中错误与异常处理的用法示例
Sep 16 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中显示格式化的用户输入
2006/10/09 PHP
php中文字母数字验证码实现代码
2008/04/25 PHP
Uncaught exception com_exception with message Failed to create COM object
2012/01/11 PHP
PHP新手用的Insert和Update语句构造类
2012/03/31 PHP
php插入中文到sqlserver 2008里出现乱码的解决办法分享
2012/07/19 PHP
jQuery 渐变下拉菜单
2009/12/15 Javascript
JS调用CS里的带参方法实例
2013/08/01 Javascript
js+div实现文字滚动和图片切换效果代码
2015/08/27 Javascript
Angularjs中三种数据的绑定策略(“@”,“=”,“&amp;”)
2016/12/23 Javascript
ES6新特性五:Set与Map的数据结构实例分析
2017/04/21 Javascript
JavaScript简介_动力节点Java学院整理
2017/06/26 Javascript
javascript Function函数理解与实战
2017/12/01 Javascript
vue源码学习之Object.defineProperty对象属性监听
2018/05/30 Javascript
js正则匹配多个全部数据问题
2019/12/20 Javascript
Vue插件之滑动验证码用法详解
2020/04/05 Javascript
ES6 Symbol在对象中的作用实例分析
2020/06/06 Javascript
在vue中使用echarts(折线图的demo,markline用法)
2020/07/20 Javascript
JavaScript JSON使用原理及注意事项
2020/07/30 Javascript
通过实例解析javascript Date对象属性及方法
2020/11/04 Javascript
用Python的Tornado框架结合memcached页面改善博客性能
2015/04/24 Python
Python实现一个Git日志统计分析的小工具
2017/12/14 Python
Python OpenCV获取视频的方法
2018/02/28 Python
Python3enumrate和range对比及示例详解
2019/07/13 Python
pycharm新建一个python工程步骤
2019/07/16 Python
Python实现朴素贝叶斯的学习与分类过程解析
2019/08/24 Python
html5开发三八女王节表白神器
2018/03/07 HTML / CSS
英国翻新电子产品购物网站:Tech Trade
2017/12/25 全球购物
Expedia挪威官网:酒店、机票和租车
2018/03/03 全球购物
Gtech官方网站:地毯清洁器、吸尘器及园艺设备
2018/05/23 全球购物
Juice Beauty官网:有机美容产品,护肤与化妆品
2020/06/13 全球购物
幼儿园安全检查制度
2014/01/30 职场文书
银行类自荐信
2014/02/04 职场文书
共产党员公开承诺践诺书
2014/05/28 职场文书
项目负责人岗位职责
2015/02/15 职场文书
复兴之路观后感
2015/06/02 职场文书
frg-100简单操作(设置)说明
2022/04/05 无线电