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版(4)
Oct 09 PHP
PHP SEO优化之URL优化方法
Apr 21 PHP
php判断变量类型常用方法
Apr 24 PHP
基于MySQL体系结构的分析
May 02 PHP
php实现查看邮件是否已被阅读的方法
Dec 03 PHP
PHP常用正则表达式集锦
Aug 17 PHP
CI框架中site_url()和base_url()的区别
Jan 07 PHP
PHP实现伪静态方法汇总
Jan 13 PHP
php数据访问之查询关键字
May 09 PHP
PHP中检索字符串的方法分析【strstr与substr_count方法】
Feb 17 PHP
THINKPHP在添加数据的时候获取主键id的值方法
Apr 03 PHP
详解php实现页面静态化原理
Jun 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不写闭合标签的好处
2014/03/04 PHP
php防止sql注入简单分析
2015/03/18 PHP
PHP生成图像验证码的方法小结(2种方法)
2016/07/18 PHP
php如何执行非缓冲查询API
2016/07/22 PHP
对setInterval在火狐和chrome切换标签产生奇怪的效果之探索,与解决方案!
2011/10/29 Javascript
JavaScript代码复用模式实例分析
2012/12/02 Javascript
文本框文本自动补全效果示例分享
2014/01/19 Javascript
js统计录入文本框中字符的个数并加以限制不超过多少
2014/05/23 Javascript
js变形金刚文字特效代码分享
2015/08/20 Javascript
IE9+已经不对document.createElement向下兼容的解决方法
2015/09/14 Javascript
快速解决Canvas.toDataURL 图片跨域的问题
2016/05/10 Javascript
hovertree插件实现二级树形菜单(简单实用)
2016/12/28 Javascript
node.js发送邮件email的方法详解
2017/01/06 Javascript
JS实现的走迷宫小游戏完整实例
2017/07/19 Javascript
webpack中使用iconfont字体图标的方法
2018/02/22 Javascript
11行JS代码制作二维码生成功能
2018/03/09 Javascript
用Vue写一个分页器的示例代码
2018/04/22 Javascript
最简单的JS实现json转csv的方法
2019/01/10 Javascript
vue使用自定义指令实现拖拽
2021/01/29 Javascript
Vue看了就会的8个小技巧
2021/01/21 Vue.js
[42:20]2014 DOTA2华西杯精英邀请赛5 24 DK VS NewBee
2014/05/25 DOTA
[31:47]夜魇凡尔赛茶话会 第三期01:选手知多少
2021/03/11 DOTA
解析Python中的生成器及其与迭代器的差异
2016/06/20 Python
Python实现Sqlite将字段当做索引进行查询的方法
2016/07/21 Python
Python 性能优化技巧总结
2016/11/01 Python
Python基于matplotlib绘制栈式直方图的方法示例
2017/08/09 Python
Python subprocess库的使用详解
2018/10/26 Python
python使用循环打印所有三位数水仙花数的实例
2018/11/13 Python
python处理“
2019/06/10 Python
python数据预处理 :数据共线性处理详解
2020/02/24 Python
King Apparel官网:英国街头服饰品牌
2019/09/05 全球购物
中专毕业生自荐信
2013/11/16 职场文书
写给学生的新学期寄语
2014/01/18 职场文书
2016党员干部反腐倡廉心得体会
2016/01/13 职场文书
Lombok的详细使用及优缺点总结
2021/07/15 Java/Android
Android Studio 计算器开发
2022/05/20 Java/Android