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 11 PHP
解析thinkphp的左右值无限分类
Jun 20 PHP
基于PHP+Ajax实现表单验证的详解
Jun 25 PHP
php语言中使用json的技巧及json的实现代码详解
Oct 27 PHP
PHP+swoole实现简单多人在线聊天群发
Jan 19 PHP
php简单统计在线人数的方法
May 10 PHP
PHP的swoole扩展安装方法详细教程
May 18 PHP
PHP获取不了React Native Fecth参数的解决办法
Aug 26 PHP
PHP实现的猴王算法(猴子选大王)示例
Apr 30 PHP
YII2框架中添加自定义模块的方法实例分析
Mar 18 PHP
php操作redis命令及代码实例大全
Nov 19 PHP
PHP大文件分割分片上传实现代码
Dec 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
使用php get_headers 判断URL是否有效的解决办法
2013/04/27 PHP
thinkphp中的多表关联查询的实例详解
2017/10/12 PHP
来自chinaz的ajax获取评论代码
2008/05/03 Javascript
JS操作select下拉框动态变动(创建/删除/获取)
2013/06/02 Javascript
JavaScript获取table中某一列的值的方法
2014/05/06 Javascript
javascript运算符——逻辑运算符全面解析
2016/06/27 Javascript
jQuery可见性过滤选择器用法示例
2016/09/09 Javascript
JavaScript DOM节点操作实例小结(新建,删除HTML元素)
2017/01/19 Javascript
BootStrap模态框和select2合用时input无法获取焦点的解决方法
2017/09/01 Javascript
详解ESLint在Vue中的使用小结
2018/10/15 Javascript
利用百度echarts实现图表功能简单入门示例【附源码下载】
2019/06/10 Javascript
js获取对象,数组所有属性键值(key)和对应值(value)的方法示例
2019/06/19 Javascript
微信小程序 可搜索的地址选择实现详解
2019/08/28 Javascript
vue3修改link标签默认icon无效问题详解
2019/10/09 Javascript
微信小程序自定义弹出模态框禁止底部滚动功能
2020/03/09 Javascript
vue根据条件不同显示不同按钮的操作
2020/08/04 Javascript
修改Vue打包后的默认文件名操作
2020/08/12 Javascript
[03:59]DOTA2英雄梦之声_第07期_水晶室女
2014/06/23 DOTA
Python中使用ElementTree解析XML示例
2015/06/02 Python
Python工厂函数用法实例分析
2018/05/14 Python
Python日志无延迟实时写入的示例
2019/07/11 Python
Marc O’Polo俄罗斯官方在线商店:德国高端时尚品牌
2019/12/26 全球购物
毕业实习个人鉴定范文
2013/12/10 职场文书
英文商务邀请信
2014/01/22 职场文书
学校爱心捐款倡议书
2014/05/13 职场文书
高中班级口号
2014/06/09 职场文书
关于感恩的演讲稿500字
2014/08/26 职场文书
公务员党员评议表自我鉴定
2014/09/14 职场文书
2015年护士工作总结范文
2015/03/31 职场文书
2015年销售助理工作总结
2015/05/11 职场文书
赢在执行观后感
2015/06/16 职场文书
2016年大学生党员承诺书
2016/03/24 职场文书
2019个人半年工作总结
2019/06/21 职场文书
创业计划书之美甲店
2019/09/20 职场文书
python 中[0]*2与0*2的区别说明
2021/05/10 Python
Redis数据同步之redis shake的实现方法
2022/04/21 Redis