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中用数组的方法设置cookies
Apr 21 PHP
php IP转换整形(ip2long)的详解
Jun 06 PHP
PHP把小数转成整数3种方法
Jun 30 PHP
php遍历数组的4种方法总结
Jul 05 PHP
PHP开发框架kohana中处理ajax请求的例子
Jul 14 PHP
配置php.ini实现PHP文件上传功能
Nov 27 PHP
php写入数据到CSV文件的方法
Mar 14 PHP
php实现用已经过去多长时间的方式显示时间
Jun 05 PHP
PHP结合Mysql数据库实现留言板功能
Mar 04 PHP
PHP+Apache+Mysql环境搭建教程
Aug 01 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
Mar 06 PHP
php实现推荐功能的简单实例
Sep 29 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 数组遍历的差异(array_diff 的实现)
2008/03/23 PHP
PHP脚本自动识别验证码查询汽车违章
2016/12/20 PHP
JS JavaScript获取Url参数,src属性参数
2021/03/09 Javascript
静态页面的值传递(三部曲)
2006/09/25 Javascript
JavaScript入门教程(12) js对象化编程
2009/01/31 Javascript
js 格式化时间日期函数小结
2010/03/20 Javascript
jquery选择器的选择使用及性能介绍
2013/01/16 Javascript
jquery实现非叠加式的搜索框提示效果
2014/01/07 Javascript
父节点获取子节点的字符串示例代码
2014/02/26 Javascript
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
2014/10/16 Javascript
javascript实现网页屏蔽Backspace事件,输入框不屏蔽
2015/07/21 Javascript
js实现全国省份城市级联下拉菜单效果代码
2015/09/07 Javascript
Bootstrap每天必学之按钮
2015/11/26 Javascript
5种JavaScript脚本加载的方式
2017/01/16 Javascript
jQuery插件FusionCharts实现的2D柱状图效果示例【附demo源码下载】
2017/03/06 Javascript
利用Angular.js编写公共提示模块的方法教程
2017/05/28 Javascript
VUE中v-model和v-for指令详解
2017/06/23 Javascript
nodejs 十六进制字符串型数据与btye型数据相互转换
2018/07/30 NodeJs
Vue实现商品飞入购物车效果(电商项目)
2019/11/26 Javascript
vue项目里面引用svg文件并给svg里面的元素赋值
2020/08/17 Javascript
JavaScript实现网页跨年倒计时
2020/12/02 Javascript
JavaScript WeakMap使用详解
2021/02/05 Javascript
[01:19:11]Ti4 循环赛第二日 NaVi.us vs iG
2014/07/11 DOTA
python GUI实现小球满屏乱跑效果
2019/05/09 Python
jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
2020/04/10 Python
pycharm专业版远程登录服务器的详细教程
2020/09/15 Python
详解Python中第三方库Faker
2020/09/25 Python
福克斯租车:Fox Rent A Car
2017/04/13 全球购物
电子信息专业学生自荐信
2013/11/09 职场文书
《望洞庭》教学反思
2014/02/16 职场文书
买卖合同纠纷代理词
2015/05/25 职场文书
暂住证证明
2015/06/19 职场文书
房地产置业顾问工作总结
2015/10/23 职场文书
使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)
2021/06/09 Vue.js
Java 关于String字符串原理上的问题
2022/04/07 Java/Android
MySQL数据库如何查看表占用空间大小
2022/06/10 MySQL