PHP设计模式之装饰器模式定义与用法简单示例


Posted in PHP onAugust 13, 2018

本文实例讲述了PHP设计模式之装饰器模式定义与用法。分享给大家供大家参考,具体如下:

装饰器模式:

如果已有对象的部分内容或功能性发生改变,但是不需要修改原始对象的结构或不使用继承,动态的扩展一个对象的功能,则应该使用装饰器模式。

简单点说:就是我们不应该去修改已有的类,而是通过创建另外一个装饰器类,通过这个装饰器类去动态的扩展其需要修改的内容,这样做的好处就是————

  • 1、我们可以保证类的层次不会因过多而发生混乱。
  • 2、当我们需求的修改很小时,不用改变原有的数据结构。

代码引用自《PHP设计模式》。

/**
* 被修饰类
现在的需求:
要求能够动态为CD添加音轨、能显示CD音轨列表。
显示时应采用单行并且为每个音轨都以音轨好为前缀。
*/
class CD
{
  public $trackList;
  function __construct()
  {
    # code...
    $this->trackList=array();
  }
  public function addTrack($track){
    $this->trackList[]=$track;
  }
  public function getTrackList(){
    $output=" ";
    foreach ($this->trackList as $key => $value) {
      # code...
      $output.=($key+1).") {$value}. ";
    }
    return $output;
  }
}
/*
现在需求发生变化:
要求将当前实例输出的音轨都采用大写形式。
这个需求并不是一个变化特别大的需求,不需要修改基类或创建一个父子关系的子类,此时创建一个基于装饰器模式的装饰器类。
*/
class CDTrackListDecoratorCaps{
  private $_cd;
  public function __construct(CD $CD){
    $this->_cd=$CD;
  }
  public function makeCaps(){
    foreach ($this->_cd->trackList as $key => $value) {
      # code...
      $this->_cd->trackList[$key]=strtoupper($value); //转换成大写
    }
  }
}
//客户端测试:
$myCD=new CD();
$trackList=array(
  "what It Means",
  "brr",
  "goodBye"
  );
foreach ($trackList as $key => $value) {
  # code...
  $myCD->addTrack($value);
}
$myCDCaps=new CDTrackListDecoratorCaps($myCD);
$myCDCaps->makeCaps();
print "The CD contains the following tracks:".$myCD->getTrackList();

运行结果:

The CD contains the following tracks: 1) WHAT IT MEANS. 2) BRR. 3) GOODBYE.

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
mysql5详细安装教程
Jan 15 PHP
php 魔术方法使用说明
Oct 20 PHP
php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)
Jul 01 PHP
深入php之规范编程命名小结
May 15 PHP
探讨如何使用SimpleXML函数来加载和解析XML文档
Jun 07 PHP
PHP文件读写操作相关函数总结
Nov 18 PHP
PHP中创建和验证哈希的简单方法实探
Jul 06 PHP
PHP在线书签系统分享
Jan 04 PHP
php简单实现多维数组排序的方法
Sep 30 PHP
PHP new static 和 new self详解
Feb 19 PHP
自定义Laravel (monolog)日志位置,并增加请求ID的实现
Oct 17 PHP
PHP使用Http Post请求发送Json对象数据代码解析
Jul 16 PHP
PHP实现的ID混淆算法类与用法示例
Aug 10 #PHP
PHP+ajax实现二级联动菜单功能示例
Aug 10 #PHP
PHP实现十进制数字与二十六进制字母串相互转换操作示例
Aug 10 #PHP
PHP实现的服务器一致性hash分布算法示例
Aug 09 #PHP
PHP检查端口是否可以被绑定的方法示例
Aug 09 #PHP
php对象工厂类完整示例
Aug 09 #PHP
php闭包中使用use声明变量的作用域实例分析
Aug 09 #PHP
You might like
如何在PHP中使用Oracle数据库(1)
2006/10/09 PHP
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
2014/07/04 PHP
Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题
2015/03/27 PHP
php多重接口的实现方法
2015/06/20 PHP
PHP模板引擎Smarty中变量的使用方法示例
2016/04/11 PHP
php json转换相关知识(小结)
2018/12/21 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
2020/04/06 PHP
深入理解javascript变量声明
2014/11/20 Javascript
window.onerror()的用法与实例分析
2016/01/27 Javascript
JS字符串的切分用法实例
2016/02/22 Javascript
jqGrid用法汇总(全经典)
2016/06/28 Javascript
最好用的Bootstrap fileinput.js文件上传组件
2016/12/12 Javascript
基于jQuery实现文字打印动态效果
2017/04/21 jQuery
使用Xcache缓存器加速PHP网站的配置方法
2017/04/22 Javascript
浅谈React 服务器端渲染的使用
2018/05/08 Javascript
微信小程序scroll-x失效的完美解决方法
2018/07/18 Javascript
jQuery+CSS实现的标签页效果示例【测试可用】
2018/08/14 jQuery
jQuery实现表格隔行换色
2018/09/01 jQuery
js单线程的本质 Event Loop解析
2019/10/29 Javascript
vue中实现回车键登录功能
2020/02/19 Javascript
python中去空格函数的用法
2014/08/21 Python
Python六大开源框架对比
2015/10/19 Python
Python3.6使用tesseract-ocr的正确方法
2018/10/17 Python
Python+OpenCV实现图像融合的原理及代码
2018/12/03 Python
python 接口实现 供第三方调用的例子
2019/08/13 Python
pycharm激活码有效到2020年11月底
2020/09/18 Python
CSS中越界问题的经典解决方案【推荐】
2016/04/19 HTML / CSS
canvas实现有递增动画的环形进度条的实现方法
2019/07/10 HTML / CSS
Timberland澳大利亚官网:全球领先的户外品牌
2019/12/10 全球购物
北美最大的参茸药食商城:德成行
2020/12/06 全球购物
大学生求职信范文应怎么写
2014/01/01 职场文书
完美的中文自荐信
2014/05/24 职场文书
校长四风对照检查材料
2014/09/27 职场文书
2014年市场部工作总结
2014/11/25 职场文书
2014年幼儿园保育工作总结
2014/12/02 职场文书