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开发框架总结收藏
Apr 24 PHP
php中定义网站根目录的常用方法
Aug 08 PHP
php设计模式 Builder(建造者模式)
Jun 26 PHP
php 中文字符串首字母的获取函数分享
Nov 04 PHP
php根据isbn书号查询amazon网站上的图书信息的示例
Feb 13 PHP
30个php操作redis常用方法代码例子
Jul 05 PHP
深入理解PHP 数组之count 函数
Jun 13 PHP
php array_map使用自定义的函数处理数组中的每个值
Oct 26 PHP
PHP利用超级全局变量$_GET来接收表单数据的实例
Nov 05 PHP
使用PHP json_decode可能遇到的坑与解决方法
Aug 03 PHP
Ajax中的JSON格式与php传输过程全面解析
Nov 14 PHP
解决在Laravel 中处理OPTIONS请求的问题
Oct 11 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获取后台Job管理的实现代码
2011/06/10 PHP
Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
2016/03/07 PHP
js判断一个元素是否为另一个元素的子元素的代码
2012/03/21 Javascript
javascript实现日期格式转换
2014/12/16 Javascript
关于JS中prototype的理解
2015/09/07 Javascript
JavaScript匿名函数之模仿块级作用域
2015/12/12 Javascript
AngularJS 入门教程之事件处理器详解
2016/08/19 Javascript
BootStrap Table后台分页时前台删除最后一页所有数据refresh刷新后无数据问题
2016/12/28 Javascript
js弹性势能动画之抛物线运动实例详解
2017/07/27 Javascript
jQuery实现鼠标响应式淘宝动画效果示例
2018/02/13 jQuery
基于 Immutable.js 实现撤销重做功能的实例代码
2018/03/01 Javascript
JavaScript实现写入文件到本地的方法【基于FileSaver.js插件】
2018/03/15 Javascript
微信小程序实现的canvas合成图片功能示例
2019/05/03 Javascript
JavaScript 实现下雪特效的示例代码
2020/09/09 Javascript
Java 生成随机字符的示例代码
2021/01/13 Javascript
[02:59]2014DOTA2西雅图国际邀请赛 圆满落幕中国夺冠
2014/07/23 DOTA
[02:09]DOTA2辉夜杯 EHOME夺冠举杯现场
2015/12/28 DOTA
Python多线程学习资料
2012/12/19 Python
在Python中操作列表之list.extend()方法的使用
2015/05/20 Python
asyncio 的 coroutine对象 与 Future对象使用指南
2016/09/11 Python
使用 Python 实现文件递归遍历的三种方式
2018/07/18 Python
python基于event实现线程间通信控制
2020/01/13 Python
Flask处理Web表单的实现方法
2021/01/31 Python
荷兰包包购物网站:The Little Green Bag
2018/03/17 全球购物
介绍一下write命令
2014/08/10 面试题
大学生校园创业计划书
2014/02/08 职场文书
秋游活动策划方案
2014/02/16 职场文书
现场活动策划方案
2014/08/22 职场文书
2014国庆节标语口号
2014/09/19 职场文书
考试作弊被抓检讨书
2014/10/02 职场文书
谢师宴邀请函
2015/02/02 职场文书
大学推普周活动总结
2015/05/07 职场文书
施工安全保证书
2015/05/09 职场文书
2015年人民调解工作总结
2015/05/18 职场文书
关于golang高并发的实现与注意事项说明
2021/05/08 Golang
nginx反向代理配置去除前缀案例教程
2021/07/26 Servers