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 相关文章推荐
打造计数器DIY三步曲(中)
Oct 09 PHP
phpmyadmin的#1251问题
Nov 25 PHP
PHP文件上传原理简单分析
May 29 PHP
php修改NetBeans默认字体的大小
Jul 02 PHP
PHP防范SQL注入的具体方法详解(测试通过)
May 09 PHP
浅析Yii2中GridView常见操作
Apr 22 PHP
php实现按天数、星期、月份查询的搜索框
May 02 PHP
Thinkphp 中 distinct 的用法解析
Dec 14 PHP
Yii2设置默认控制器的两种方法
May 19 PHP
thinkphp3.2实现在线留言提交验证码功能
Jul 19 PHP
php fread函数使用方法总结
May 28 PHP
laravel按天、按小时,查询数据的实例
Oct 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
动漫女神老婆无限好,但日本女生可能就不是这么一回事了!
2020/03/04 日漫
PHP4实际应用经验篇(2)
2006/10/09 PHP
PHP return语句另类用法不止是在函数中
2014/09/17 PHP
超详细的php用户注册页面填写信息完整实例(附源码)
2015/11/17 PHP
ZendFramework2连接数据库操作实例
2017/04/18 PHP
浅谈thinkphp5 instance 的简单实现
2017/07/30 PHP
php判断/计算闰年的方法小结【三种方法】
2019/07/06 PHP
JS获取scrollHeight问题想到的标准问题
2007/05/27 Javascript
JavaScript版DateAdd和DateDiff函数代码
2012/03/01 Javascript
纯js实现瀑布流展现照片(自动适应窗口大小)
2013/04/08 Javascript
JS关闭窗口或JS关闭页面的几种代码分享
2013/10/25 Javascript
jQuery 1.9.1源码分析系列(十三)之位置大小操作
2015/12/02 Javascript
JavaScript观察者模式(经典)
2015/12/09 Javascript
JavaScript实现翻页功能(附效果图)
2017/02/16 Javascript
jQuery+Datatables实现表格批量删除功能【推荐】
2018/10/24 jQuery
vue通过指令(directives)实现点击空白处收起下拉框
2018/12/06 Javascript
原生js基于canvas实现一个简单的前端截图工具代码实例
2019/09/10 Javascript
js获取本日、本周、本月的时间代码
2020/02/01 Javascript
JavaScript设计模式--简单工厂模式定义与应用案例详解
2020/05/23 Javascript
Python日期操作学习笔记
2008/10/07 Python
django中静态文件配置static的方法
2018/05/20 Python
pytorch多进程加速及代码优化方法
2019/08/19 Python
Python3实现英文字母转换哥特式字体实例代码
2020/09/01 Python
html5使用canvas实现跟随光标跳动的火焰效果
2014/01/07 HTML / CSS
简单介绍HTML5中audio标签的使用
2015/09/24 HTML / CSS
Kenneth Cole官网:纽约时尚优雅品牌
2016/11/14 全球购物
超市中秋节活动方案
2014/02/12 职场文书
汽车促销活动方案
2014/03/31 职场文书
中学生期中自我鉴定
2014/04/20 职场文书
暑期社会实践先进个人主要事迹
2014/05/22 职场文书
2014年幼儿园老师工作总结
2014/12/05 职场文书
史上最牛的辞职信
2015/02/28 职场文书
停电调休通知
2015/04/16 职场文书
2015年高三班主任工作总结
2015/05/21 职场文书
python全面解析接口返回数据
2022/02/12 Python
「魔导具师妲莉亚永不妥协~从今天开始的自由职人生活~」1、2卷发售宣传CM公开
2022/03/21 日漫