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 strtok()函数的优点分析
Mar 02 PHP
用PHP实现递归循环每一个目录
Aug 08 PHP
用php的ob_start来生成静态页面的方法分析
Mar 09 PHP
php数组函数序列之krsort()- 对数组的元素键名进行降序排序,保持索引关系
Nov 02 PHP
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
Dec 05 PHP
php中通过curl smtp发送邮件
Jun 05 PHP
php数组相加 array(“a”)+array(“b”)结果还是array(“a”)
Sep 19 PHP
hadoop常见错误以及处理方法详解
Jun 19 PHP
ThinkPHP模板中数组循环实例
Oct 30 PHP
ThinkPHP写数组插入与获取最新插入数据ID实例
Nov 03 PHP
php调用自己java程序的方法详解
May 13 PHP
php生成二维码不保存服务器还有下载功能的实现代码
Aug 09 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
一个查看session内容的函数
2006/10/09 PHP
php新建文件自动编号的思路与实现
2011/06/27 PHP
PHP取整数函数常用的四种方法小结
2012/07/05 PHP
php插入中文到sqlserver 2008里出现乱码的解决办法分享
2012/07/19 PHP
WebQQ最新登陆协议的用法
2014/12/22 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
2015/09/20 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
2019/10/23 PHP
B/S开发中常用javaScript技术与代码
2007/03/09 Javascript
jQuery 图片切换插件(代码比较少)
2012/05/07 Javascript
js 表单提交后按钮变灰的实例代码
2013/08/16 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
可选择和输入的下拉列表框示例
2013/11/05 Javascript
可自定义速度的js图片无缝滚动示例分享
2014/01/20 Javascript
网站内容禁止复制和粘贴、另存为的js代码
2014/02/26 Javascript
使用JS中的exec()方法构造正则表达式验证
2016/08/01 Javascript
详解easyui 切换主题皮肤
2019/04/04 Javascript
js实现图片粘贴到网页
2019/12/06 Javascript
python构造icmp echo请求和实现网络探测器功能代码分享
2014/01/10 Python
python实现搜索指定目录下文件及文件内搜索指定关键词的方法
2015/06/28 Python
PyQt5 pyqt多线程操作入门
2018/05/05 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
2020/03/14 Python
Python selenium文件上传下载功能代码实例
2020/04/13 Python
Python3实现个位数字和十位数字对调, 其乘积不变
2020/05/03 Python
python3获取控制台输入的数据的具体实例
2020/08/16 Python
html5构建触屏网站之touch事件介绍
2013/01/07 HTML / CSS
移动端Html5页面生成图片解决方案
2018/08/07 HTML / CSS
计算机系毕业生推荐信
2013/11/06 职场文书
创业计划书怎样才能打动风投
2014/01/01 职场文书
初中校园广播稿
2014/02/02 职场文书
会计岗位描述
2014/02/22 职场文书
工作睡觉检讨书
2014/02/25 职场文书
保护动物倡议书
2014/04/15 职场文书
2014班子成员自我剖析材料思想汇报
2014/10/01 职场文书
学校教学工作总结2015
2015/05/19 职场文书
公司人力资源管理制度
2015/08/05 职场文书
十大动画制作软件,Adobe产品上榜两款,第一是行业标准软件
2022/03/18 杂记