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 相关文章推荐
DedeCms模板安装/制作概述
Mar 11 PHP
Mysql的GROUP_CONCAT()函数使用方法
Mar 28 PHP
PHP mkdir()定义和用法
Jan 14 PHP
php Smarty初体验二 获取配置信息
Aug 08 PHP
PHP中spl_autoload_register()和__autoload()区别分析
May 10 PHP
解密ThinkPHP3.1.2版本之模块和操作映射
Jun 19 PHP
ThinkPHP查询语句与关联查询用法实例
Nov 01 PHP
PHP输出两个数字中间有多少个回文数的方法
Mar 23 PHP
关于WordPress的SEO优化相关的一些PHP页面脚本技巧
Dec 10 PHP
PHP实现求解最长公共子串问题的方法
Nov 17 PHP
Laravel框架使用Seeder实现自动填充数据功能
Jun 13 PHP
利用PHP计算有多少小于当前数字的数字方法示例
Aug 26 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
通过ICQ网关发送手机短信的PHP源程序
2006/10/09 PHP
如何从一个php文件向另一个地址post数据,不用表单和隐藏的变量的
2007/03/06 PHP
PHP filter_var() 函数 Filter 函数
2012/04/25 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
2012/06/13 PHP
PHP保留两位小数的几种方法
2019/07/24 PHP
javascript不同页面传值的改进版
2008/09/30 Javascript
JS如何判断移动端访问设备并解析对应CSS
2013/11/27 Javascript
node.js中的fs.unlink方法使用说明
2014/12/15 Javascript
使用angular写一个hello world
2015/01/23 Javascript
分享Javascript实用方法二
2015/12/13 Javascript
JavaScript Split()方法
2015/12/18 Javascript
分享jQuery插件的学习笔记
2016/01/14 Javascript
基于JS实现Android,iOS一个手势动画效果
2016/04/27 Javascript
jQuery实现的网格线绘制方法
2016/06/20 Javascript
浅谈EasyUi ComBotree树修改 父节点选择的问题
2016/11/07 Javascript
AngularJS基于ui-route实现深层路由的方法【路由嵌套】
2016/12/14 Javascript
Angularjs使用ng-repeat中$even和$odd属性的注意事项
2016/12/31 Javascript
AngularJS中的缓存使用
2017/01/11 Javascript
Vue2.0 vue-source jsonp 跨域请求
2017/08/04 Javascript
Django使用多数据库的方法
2017/09/06 Javascript
详解vue-cli脚手架中webpack配置方法
2018/08/22 Javascript
新手必须知的Node.js 4个JavaScript基本概念
2018/09/16 Javascript
JavaScript基于遍历操作实现对象深拷贝功能示例
2019/03/05 Javascript
微信小程序实现禁止分享代码实例
2019/10/19 Javascript
python多线程操作实例
2014/11/21 Python
Python的SQLAlchemy框架使用入门
2015/04/29 Python
Python的爬虫程序编写框架Scrapy入门学习教程
2016/07/02 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
python删除列表元素的三种方法(remove,pop,del)
2019/07/22 Python
使用Python画出小人发射爱心的代码
2019/11/23 Python
Python threading模块condition原理及运行流程详解
2020/10/05 Python
Pytorch实验常用代码段汇总
2020/11/19 Python
售后服务科岗位职责范文
2013/11/13 职场文书
药品业务员岗位职责
2014/04/17 职场文书
2014年师德师风学习材料
2014/05/16 职场文书
爱晚亭导游词
2015/02/09 职场文书