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执行速度全攻略
Oct 09 PHP
web方式ftp
Oct 09 PHP
PHP初学者常见问题集合 修正版(21问答)
Mar 23 PHP
PHP 第二节 数据类型之数组
Apr 28 PHP
php查找任何页面上的所有链接的方法
Dec 03 PHP
浅析PHP的静态成员函数效率更高的原因
Jun 13 PHP
Zend Framework页面缓存实例
Jun 25 PHP
php遍历类中包含的所有元素的方法
May 12 PHP
php实现微信模板消息推送
Mar 30 PHP
PHP开发实现快递查询功能详解
Apr 08 PHP
thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例
Jul 03 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
Mar 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与SQL注入攻击[一]
2007/04/17 PHP
PHP设计模式之解释器模式的深入解析
2013/06/13 PHP
自定义min版smarty模板引擎MinSmarty.class.php文件及用法
2016/05/20 PHP
PHP防止图片盗用(盗链)的方法小结
2016/11/11 PHP
PHP与以太坊交互详解
2018/08/24 PHP
ExtJS 2.0实用简明教程 之Border区域布局
2009/04/29 Javascript
用Javascript同时提交多个Web表单的方法
2009/12/26 Javascript
js string 转 int 注意的问题小结
2013/08/15 Javascript
js编写trim()函数及正则表达式的运用
2013/10/24 Javascript
修复bash漏洞的shell脚本分享
2014/12/31 Javascript
jQuery中unwrap()方法用法实例
2015/01/16 Javascript
jQuery实现弹出窗口中切换登录与注册表单
2015/06/05 Javascript
js判断文本框输入的内容是否为数字
2015/12/23 Javascript
JavaScript继承模式粗探
2016/01/12 Javascript
JS获取input file绝对路径的方法(推荐)
2016/08/02 Javascript
vue + typescript + video.js实现 流媒体播放 视频监控功能
2019/07/07 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
2019/09/01 Javascript
基于jquery实现彩色投票进度条代码解析
2020/08/26 jQuery
Python中的XML库4Suite Server的介绍
2015/04/14 Python
Python编程使用NLTK进行自然语言处理详解
2017/11/16 Python
Python xlwt设置excel单元格字体及格式
2020/04/18 Python
对python pandas读取剪贴板内容的方法详解
2019/01/24 Python
详解js文件通过python访问数据库方法
2019/03/03 Python
Pycharm保存不能自动同步到远程服务器的解决方法
2019/06/27 Python
CSS类名支持中文命名的示例
2014/04/04 HTML / CSS
美国领先的礼品卡网站:GiftCards.com
2016/11/02 全球购物
Juicy Couture Beauty官方网站:香水和化妆品
2019/03/12 全球购物
系统管理员的职责包括那些?管理的对象是什么?
2016/09/20 面试题
财务人员个人自荐信范文
2013/09/26 职场文书
硕士研究生自我鉴定
2013/11/08 职场文书
秘书岗位职责
2013/11/18 职场文书
幼儿园国庆节活动方案
2014/02/01 职场文书
师德师风自查总结
2014/10/14 职场文书
爱心捐款感谢信
2015/01/20 职场文书
2019企业给员工的慰问信
2019/06/24 职场文书
浅谈PHP7中的一些小技巧
2021/05/29 PHP