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的SQL注入实现(测试代码安全不错)
Feb 27 PHP
JS中encodeURIComponent函数用php解码的代码
Mar 01 PHP
PHP最常用的2种设计模式工厂模式和单例模式介绍
Aug 14 PHP
用PHP即时捕捉PHP中的错误并发送email通知的实现代码
Jan 19 PHP
php实现ip白名单黑名单功能
Mar 12 PHP
php动态函数调用方法
May 21 PHP
PHP 类与构造函数解析
Feb 06 PHP
PHP判断数组是否为空的常用方法(五种方法)
Feb 08 PHP
highchart数据源纵轴json内的值必须是int(详解)
Feb 20 PHP
php微信开发之音乐回复功能
Jun 14 PHP
Yii2.0框架behaviors方法使用实例分析
Sep 30 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 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
十大感人催泪爱情动漫 第一名至今不忍在看第二遍
2020/03/04 日漫
php实现的递归提成方案实例
2015/11/14 PHP
谈谈php对接芝麻信用踩的坑
2016/12/01 PHP
PHP实现随机生成水印图片功能
2017/03/22 PHP
JavaScript 异步调用框架 (Part 2 - 用例设计)
2009/08/03 Javascript
对字符串进行HTML编码和解码的JavaScript函数
2010/02/01 Javascript
js操作iframe的一些方法介绍
2013/06/25 Javascript
js利用事件的阻止冒泡实现点击空白模态框的隐藏
2014/01/24 Javascript
一款由jquery实现的整屏切换特效
2014/09/15 Javascript
node.JS md5加密中文与php结果不一致的解决方法
2017/05/05 Javascript
jquery实现提示语淡入效果
2017/05/05 jQuery
原生js FileReader对象实现图片上传本地预览效果
2020/03/27 Javascript
nodejs创建简易web服务器与文件读写的实例
2017/09/07 NodeJs
使用clipboard.js实现复制功能的示例代码
2017/10/16 Javascript
JavaScript异步操作的几种常见处理方法实例总结
2020/05/11 Javascript
vue 子组件修改data或调用操作
2020/08/07 Javascript
python中利用队列asyncio.Queue进行通讯详解
2017/09/10 Python
python对视频画框标记后保存的方法
2018/12/07 Python
python可视化爬虫界面之天气查询
2019/07/03 Python
Django 反向生成url实例详解
2019/07/30 Python
Python文件夹批处理操作代码实例
2020/07/21 Python
Python脚本实现Zabbix多行日志监控过程解析
2020/08/26 Python
python装饰器代码深入讲解
2021/03/01 Python
英国Office鞋店德国网站:在线购买鞋子、靴子和运动鞋
2018/12/19 全球购物
Reebok官方旗舰店:美国知名健身品牌锐步
2019/01/07 全球购物
Berghaus官网:户外服装和设备,防水服
2020/01/17 全球购物
巴西备受欢迎的服装和生活方式品牌:FARM Rio
2020/02/04 全球购物
大学毕业感言
2014/01/10 职场文书
同事吵架检讨书
2014/02/05 职场文书
作文批改评语大全
2014/04/23 职场文书
教师纪念9.18事件演讲稿范文
2014/09/14 职场文书
2015年复活节活动总结
2015/02/27 职场文书
交通处罚决定书
2015/06/24 职场文书
2015年汽车销售员工作总结
2015/07/24 职场文书
2016年优秀班主任先进事迹材料
2016/02/26 职场文书
ORM模型框架操作mysql数据库的方法
2021/07/25 MySQL