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开发GUI
Oct 09 PHP
PHP中register_globals参数为OFF和ON的区别(register_globals 使用详解)
Feb 05 PHP
PHP 自定义错误处理函数trigger_error()
Mar 26 PHP
PHP COOKIE及时生效的方法介绍
Feb 14 PHP
PHP的foreach中使用引用时需要注意的一个问题和解决方法
May 29 PHP
探寻PHP脚本不报错的原因
Jun 12 PHP
ThinkPHP实现事务回滚示例代码
Jun 23 PHP
php中getservbyport与getservbyname函数用法实例
Nov 18 PHP
php实现用于计算执行时间的类实例
Apr 18 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
Jun 13 PHP
php操作路径的经典方法(必看篇)
Oct 04 PHP
PHP编辑器PhpStrom运行缓慢问题
Feb 21 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 chmod 函数与批量修改文件目录权限
2010/05/10 PHP
php eval函数用法总结
2012/10/31 PHP
javascript 硬盘序列号+其它硬件信息
2008/12/23 Javascript
jQuery实现的图片分组切换焦点图插件
2015/01/06 Javascript
本人自用的global.js库源码分享
2015/02/28 Javascript
浅谈JavaScript中变量和函数声明的提升
2016/08/09 Javascript
原生ajax处理json格式数据的实例代码
2016/12/25 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
2017/02/08 Javascript
js date 格式化
2017/02/15 Javascript
bootstrap栅格系统示例代码分享
2017/05/22 Javascript
js使用xml数据载体实现城市省份二级联动效果
2017/11/08 Javascript
seajs下require书写约定实例分析
2018/05/16 Javascript
vuejs使用axios异步访问时用get和post的实例讲解
2018/08/09 Javascript
vue实现多个元素或多个组件之间动画效果
2018/09/25 Javascript
js中null与空字符串&quot;&quot;的区别讲解
2019/01/17 Javascript
JS代码检查工具ESLint介绍与使用方法
2020/02/04 Javascript
Vue如何实现验证码输入交互
2020/12/07 Vue.js
python使用PyFetion来发送短信的例子
2014/04/22 Python
python sort、sorted高级排序技巧
2014/11/21 Python
Django 添加静态文件的两种实现方法(必看篇)
2017/07/14 Python
python对配置文件.ini进行增删改查操作的方法示例
2017/07/28 Python
Python使用socket模块实现简单tcp通信
2020/08/18 Python
Python模拟登录和登录跳转的参考示例
2020/10/30 Python
Python监听剪切板实现方法代码实例
2020/11/11 Python
Python的信号库Blinker用法详解
2020/12/31 Python
Booking.com荷兰:全球酒店网上预订
2017/08/22 全球购物
音乐专业应届生教师求职信
2013/11/04 职场文书
幼儿园春游活动方案
2014/01/19 职场文书
小学生运动会通讯稿
2014/09/23 职场文书
HAM-2000摩机图
2021/04/22 无线电
浅谈Redis在直播场景的实践方案
2021/04/27 Redis
javascript对象3个属性特征
2021/11/17 Javascript
python_tkinter弹出对话框创建
2022/03/20 Python
python3 字符串str和bytes相互转换
2022/03/23 Python
vue封装数字翻牌器
2022/04/20 Vue.js
使用Cargo工具高效创建Rust项目
2022/08/14 Javascript