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 相关文章推荐
随时给自己贴的图片加文字的php水印
Mar 16 PHP
可以在线执行PHP代码包装修正版
Mar 15 PHP
php操作sqlserver关于时间日期读取的小小见解
Nov 29 PHP
PHP中header和session_start前不能有输出原因分析
Jan 11 PHP
linux命令之调试工具strace的深入分析
Jun 03 PHP
php类常量的使用详解
Jun 08 PHP
免费的ip数据库淘宝IP地址库简介和PHP调用实例
Apr 08 PHP
PHP实现将视频转成MP4并获取视频预览图的方法
Mar 12 PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
Jun 17 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
Oct 29 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
Oct 31 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
Dec 18 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
drupal 代码实现URL重写
2011/05/04 PHP
10个简化PHP开发的工具
2014/12/25 PHP
PHP开发制作一个简单的活动日程表Calendar
2016/06/20 PHP
PHP crc32()函数讲解
2019/02/14 PHP
jqgrid 简单学习笔记
2011/05/03 Javascript
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
2011/12/20 Javascript
在js(jquery)中获得文本框焦点和失去焦点的方法
2012/12/04 Javascript
Javascript数组与字典用法分析
2014/12/13 Javascript
jQuery实用技巧必备(上)
2015/11/02 Javascript
Easyui 之 Treegrid 笔记
2016/04/29 Javascript
微信小程序链接传参并跳转新页面
2016/11/29 Javascript
在vue项目中引入highcharts图表的方法(详解)
2018/03/05 Javascript
在create-react-app中使用css modules的示例代码
2018/07/31 Javascript
Node.js事件的正确使用方法
2019/04/05 Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
2019/09/05 Javascript
通过滑动翻页效果实现和移动端click事件问题
2021/01/26 Javascript
[02:45]DOTA2英雄敌法师基础教程
2013/11/25 DOTA
python3.3使用tkinter开发猜数字游戏示例
2014/03/14 Python
Python爬取Coursera课程资源的详细过程
2014/11/04 Python
Python3安装Scrapy的方法步骤
2017/11/23 Python
Windows下Anaconda2安装NLTK教程
2018/09/19 Python
python实现最小二乘法线性拟合
2019/07/19 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
2020/09/21 Python
CSS3 Calc实现滚动条出现页面不跳动问题
2017/09/14 HTML / CSS
HTML5使用ApplicationCache接口实现离线缓存技术解决离线难题
2012/12/13 HTML / CSS
Html5页面内使用JSON动画的实现
2019/01/29 HTML / CSS
美国女鞋品牌:naturalizer(娜然)
2016/08/01 全球购物
美国受信赖的教育产品供应商:Nest Learning
2018/06/14 全球购物
印度尼西亚值得信赖的第一家网店:Bhinneka
2018/07/16 全球购物
激光脱毛、蓝光和护肤:Tria Beauty
2019/03/28 全球购物
泰海淘:泰国king Power王权免税集团旗下跨境海淘综合型电商
2020/07/26 全球购物
个人自我鉴定范文
2013/10/04 职场文书
社区志愿服务活动感想
2015/08/07 职场文书
MySQL窗口函数的具体使用
2021/11/17 MySQL
Python+tkinter实现高清图片保存
2022/03/13 Python
Python学习之时间包使用教程详解
2022/03/21 Python