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 相关文章推荐
Apache2中实现多网站域名绑定的实现方法
Jun 01 PHP
实测在class的function中include的文件中非php的global全局环境
Jul 15 PHP
PHP中time(),date(),mktime()区别介绍
Sep 28 PHP
php实现singleton()单例模式实例
Nov 06 PHP
php启用sphinx全文搜索的实现方法
Dec 24 PHP
php取得字符串首字母的方法
Mar 25 PHP
thinkphp autoload 命名空间自定义 namespace
Jul 17 PHP
简单谈谈PHP中strlen 函数
Feb 27 PHP
Yii2实现上下联动下拉框功能的方法
Aug 10 PHP
PHP实现QQ登录的开原理和实现过程
Feb 04 PHP
PHP如何通过表单直接提交大文件详解
Jan 08 PHP
php微信小程序解包过程实例详解
Mar 31 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 遍历XP文件夹下所有文件
2008/11/27 PHP
PHP 读取和修改大文件的某行内容的代码
2009/10/30 PHP
ThinkPHP利用PHPMailer实现邮件发送实现代码
2013/09/26 PHP
PHP递归调用数组值并用其执行指定函数的方法
2015/04/01 PHP
php编写批量生成不重复的卡号密码代码
2015/05/14 PHP
php批量转换文件夹下所有文件编码的函数类
2017/08/06 PHP
dess中一个简单的多路委托的实现
2010/07/20 Javascript
js对象的构造和继承实现代码
2010/12/05 Javascript
深入理解JavaScript系列(48):对象创建模式(下篇)
2015/03/04 Javascript
深入理解JavaScript系列(49):Function模式(上篇)
2015/03/04 Javascript
javascript元素动态创建实现方法
2015/05/13 Javascript
jQuery实现TAB风格的全国省份城市滑动切换效果代码
2015/08/24 Javascript
KnockoutJS 3.X API 第四章之表单textInput、hasFocus、checked绑定
2016/10/11 Javascript
Vue.js 插件开发详解
2017/03/29 Javascript
Vue.js移动端左滑删除组件的实现代码
2017/09/08 Javascript
vue+node实现图片上传及预览的示例方法
2018/11/22 Javascript
Nodejs中的require函数的具体使用方法
2019/04/02 NodeJs
使用layui日期控件laydate对开始和结束时间进行联动控制的方法
2019/09/06 Javascript
vue-cli中实现响应式布局的方法
2021/03/02 Vue.js
[01:28:31]《加油DOTA》真人秀 第五期
2014/09/01 DOTA
[01:24:16]2018DOTA2亚洲邀请赛 4.6 全明星赛
2018/04/10 DOTA
Python Web框架Flask中使用新浪SAE云存储实例
2015/02/08 Python
python使用psutil模块获取系统状态
2016/08/27 Python
微信跳一跳python代码实现
2018/01/05 Python
判断python字典中key是否存在的两种方法
2018/08/10 Python
Pycharm运行加载文本出现错误的解决方法
2019/06/27 Python
python语言是免费还是收费的?
2020/06/15 Python
HTML5实现多张图片上传功能
2016/03/11 HTML / CSS
米兰网婚纱礼服法国网上商店:Milanoo法国
2016/08/20 全球购物
《九色鹿》教学反思
2014/02/27 职场文书
煤矿安全协议书
2014/08/20 职场文书
2014年乡镇党建工作总结
2014/11/11 职场文书
MySQL 使用自定义变量进行查询优化
2021/05/14 MySQL
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python
MySQL Shell import_table数据导入的实现
2021/08/07 MySQL
Canvas绘制像素风图片的示例代码
2021/09/25 HTML / CSS