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
通过文字传递创建的图形按钮
Oct 09 PHP
php checkbox复选框值的获取与checkbox默认值输出方法
May 15 PHP
Can't create/write to file 'C:\WINDOWS\TEMP\...MYSQL报错解决方法
Jun 30 PHP
php curl模拟post提交数据示例
Dec 31 PHP
Session 失效的原因汇总及解决丢失办法
Sep 30 PHP
php生成唯一数字id的方法汇总
Nov 18 PHP
PHP实现路由映射到指定控制器
Aug 13 PHP
PHP7常量数组用法分析
Sep 26 PHP
Laravel框架中Blade模板的用法示例
Aug 30 PHP
php装饰者模式简单应用案例分析
Oct 23 PHP
php使用redis的几种常见操作方式和用法示例
Feb 20 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
CI框架整合smarty步骤详解
2016/05/19 PHP
js实现iframe动态调整高度的代码
2008/01/06 Javascript
javascript 面向对象继承
2009/11/26 Javascript
老鱼 浅谈javascript面向对象编程
2010/03/04 Javascript
IE6下js通过css隐藏select的一个bug
2010/08/16 Javascript
jQuery UI Autocomplete 体验分享
2012/02/14 Javascript
通过AJAX的JS、JQuery两种方式解析XML示例介绍
2013/09/23 Javascript
深入领悟JavaScript中的面向对象
2013/11/18 Javascript
JavaScript中的全局对象介绍
2015/01/01 Javascript
js实现禁止中文输入的方法
2015/01/14 Javascript
有关easyui-layout中的收缩层无法显示标题的解决办法
2016/05/10 Javascript
javascript闭包概念简单解析(推荐)
2016/06/03 Javascript
移动端点击图片放大特效PhotoSwipe.js插件实现
2016/08/25 Javascript
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
WebPack基础知识详解
2017/01/16 Javascript
老生常谈javascript中逻辑运算符&&和||的返回值问题
2017/04/13 Javascript
AngularJS 打开新的标签页实现代码
2017/09/07 Javascript
解决VUEX兼容IE上的报错问题
2018/03/01 Javascript
微信小程序methods中定义的方法互相调用的实例代码
2018/08/07 Javascript
JS实现的tab页切换效果完整示例
2018/12/18 Javascript
ES6 Symbol在对象中的作用实例分析
2020/06/06 Javascript
python连接池实现示例程序
2013/11/26 Python
python传递参数方式小结
2015/04/17 Python
Python使用struct处理二进制的实例详解
2017/09/11 Python
Python多进程并发与多线程并发编程实例总结
2018/02/08 Python
Python实现使用dir获取类的方法列表
2019/12/24 Python
Python高阶函数、常用内置函数用法实例分析
2019/12/26 Python
谈谈对css属性box-sizing的了解
2017/01/04 HTML / CSS
美国家具网站:Cymax
2016/09/17 全球购物
精彩的推荐信范文
2013/11/26 职场文书
保护环境的标语
2014/06/09 职场文书
劳模先进事迹材料
2014/12/24 职场文书
就业意向协议书
2015/01/29 职场文书
走进科学观后感
2015/06/18 职场文书
Pytorch 如何实现LSTM时间序列预测
2021/05/17 Python
Django框架中表单的用法
2022/06/10 Python