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 相关文章推荐
Windows下利用Gvim写PHP产生中文乱码问题解决方法
Apr 20 PHP
PHP中限制IP段访问、禁止IP提交表单的代码
Apr 23 PHP
遍历指定目录下的所有目录和文件的php代码
Nov 27 PHP
php设置页面超时时间解决方法
Sep 22 PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
Dec 09 PHP
PHP中的Trait 特性及作用
Apr 03 PHP
php制作简单模版引擎
Apr 07 PHP
关于PHP内置的字符串处理函数详解
Feb 04 PHP
PHP hex2bin()函数用法讲解
Feb 25 PHP
laravel实现上传图片并在页面显示的例子
Oct 14 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
Jan 26 PHP
Yii实现微信公众号场景二维码的方法实例
Aug 30 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
PHP4实际应用经验篇(7)
2006/10/09 PHP
php操作SVN版本服务器类代码
2011/11/27 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
基于jquery的让页面控件不可用的实现代码
2010/04/27 Javascript
javascript new fun的执行过程
2010/08/05 Javascript
datagrid框架的删除添加与修改
2013/04/08 Javascript
兼容主流浏览器的iframe自适应高度js脚本
2014/01/10 Javascript
提高NodeJS中SSL服务的性能
2014/07/15 NodeJs
JavaScript转换二进制编码为ASCII码的方法
2015/04/16 Javascript
javascript控制台详解
2015/06/25 Javascript
JS实现鼠标滑过折叠与展开菜单效果代码
2015/09/06 Javascript
Bootstrap笔记之缩略图、警告框实例详解
2017/03/09 Javascript
javascript实现Java中的Map对象功能的实例详解
2017/08/21 Javascript
react-router4 配合webpack require.ensure 实现异步加载的示例
2018/01/18 Javascript
vue element项目引入icon图标的方法
2018/06/06 Javascript
vue中添加与删除关键字搜索功能
2019/10/12 Javascript
vue实现用户长时间不操作自动退出登录功能的实现代码
2020/07/23 Javascript
在antd中setFieldsValue和defaultVal的用法
2020/10/29 Javascript
[46:03]LGD vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[50:15]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
在python3环境下的Django中使用MySQL数据库的实例
2017/08/29 Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
2017/09/11 Python
python实现微信定时每天和女友发送消息
2019/04/29 Python
Python实现Linux监控的方法
2019/05/16 Python
Django 模型类(models.py)的定义详解
2019/07/19 Python
详解Django 时间与时区设置问题
2019/07/23 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
2019/08/13 Python
Python读取图像并显示灰度图的实现
2020/12/01 Python
中国梦的演讲稿
2014/01/08 职场文书
我为党旗添光彩演讲稿
2014/09/10 职场文书
女生抽烟检讨书
2014/10/05 职场文书
2014年关工委工作总结
2014/11/17 职场文书
2014年公路养护工作总结
2014/12/04 职场文书
个人事迹材料怎么写
2014/12/30 职场文书
写给女朋友的检讨书
2015/05/06 职场文书
学术会议开幕词
2016/03/03 职场文书