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 imagecreatefrombmp 从BMP文件或URL新建一图像
Jul 16 PHP
解析php通过cookies获取远程网页的指定代码
Jun 25 PHP
CURL状态码列表(详细)
Jun 27 PHP
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
Jun 12 PHP
PHP中的reflection反射机制测试例子
Aug 05 PHP
PHP单例模式详细介绍
Jul 01 PHP
详解php魔术方法(Magic methods)的使用方法
Feb 14 PHP
简单解析PHP程序的运行流程
Jun 23 PHP
总结PHP中数值计算的注意事项
Aug 14 PHP
php实现遍历文件夹的方法汇总
Mar 02 PHP
laravel中的一些简单实用功能
Nov 03 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
Apr 07 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
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
2006/12/06 PHP
PHP递归算法的详细示例分析
2013/02/19 PHP
js代码实现微博导航栏
2015/07/30 PHP
PHP入门教程之图像处理技巧分析
2016/09/11 PHP
PHP 范围解析操作符(::)用法分析【访问静态成员和类常量】
2020/04/14 PHP
javascript正则表达式中参数g(全局)的作用
2010/11/11 Javascript
jquery对单选框,多选框,文本框等常见操作小结
2014/01/08 Javascript
动态加载js、css等文件跨iframe实现
2014/02/24 Javascript
jQuery自动完成插件completer附源码下载
2016/01/04 Javascript
BootStrap中的table实现数据填充与分页应用小结
2016/05/26 Javascript
bootstrap suggest下拉框使用详解
2017/04/10 Javascript
原生JS上传大文件显示进度条 php上传文件代码
2020/03/27 Javascript
详解Vue2.0组件的继承与扩展
2018/11/23 Javascript
JS中min函数实例讲解
2019/02/18 Javascript
JS面向对象编程实现的Tab选项卡案例详解
2020/03/03 Javascript
用map函数来完成Python并行任务的简单示例
2015/04/02 Python
python3解析库BeautifulSoup4的安装配置与基本用法
2018/06/26 Python
Python XlsxWriter模块Chart类用法实例分析
2019/03/11 Python
Pandas之排序函数sort_values()的实现
2019/07/09 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
2020/06/12 Python
如何用Anaconda搭建虚拟环境并创建Django项目
2020/08/02 Python
size?瑞典:英国伦敦的球鞋精品店
2018/03/01 全球购物
电脑专业个人求职信范文
2014/02/04 职场文书
办公室主任竞聘演讲稿
2014/05/15 职场文书
小学生常见病防治方案
2014/06/06 职场文书
2014年小学数学工作总结
2014/12/12 职场文书
教师业务学习材料
2014/12/16 职场文书
2015年反腐倡廉工作总结
2015/05/14 职场文书
收入证明范本
2015/06/12 职场文书
医务人员岗前培训心得体会
2016/01/08 职场文书
用javascript制作qq注册动态页面
2021/04/14 Javascript
redis 限制内存使用大小的实现
2021/05/08 Redis
Python图片检索之以图搜图
2021/05/31 Python
Java实现二维数组和稀疏数组之间的转换
2021/06/27 Java/Android
Python 数据可视化工具 Pyecharts 安装及应用
2022/04/20 Python
新的CSS 伪类函数 :is() 和 :where()示例详解
2022/08/05 HTML / CSS