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合并数组array_merge函数运算符加号与的区别
Oct 31 PHP
php csv操作类代码
Dec 14 PHP
php实现的遍历文件夹下所有文件,编辑删除
Jan 05 PHP
PHP 时间日期操作实战
Aug 26 PHP
第七章 php自定义函数实现代码
Dec 30 PHP
PHP基础学习之流程控制的实现分析
Apr 28 PHP
php中如何判断一个网页请求是ajax请求还是普通请求
Aug 10 PHP
php网页病毒清除类
Dec 08 PHP
基于thinkPHP3.2实现微信接入及查询token值的方法
Apr 18 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
Feb 19 PHP
laravel 之 Eloquent 模型修改器和序列化示例
Oct 17 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
Oct 27 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 编写安全的代码时容易犯的错误小结
2010/05/20 PHP
2款PHP无限级分类实例代码
2015/11/11 PHP
Yii框架操作cookie与session的方法实例详解
2019/09/04 PHP
PHP7原生MySQL数据库操作实现代码
2020/07/03 PHP
聊聊 PHP 8 新特性 Attributes
2020/08/19 PHP
关于JavaScript的变量的数据类型的判断方法
2015/08/14 Javascript
jQuery无刷新切换主题皮肤实例讲解
2015/10/21 Javascript
Bootstrap每天必学之面板
2015/11/30 Javascript
深入浅析NodeJs并发异步的回调处理
2015/12/21 NodeJs
JavaScript动态设置div的样式的方法
2015/12/26 Javascript
JS组件Bootstrap Table布局详解
2016/05/27 Javascript
深入浅析JS是按值传递还是按引用传递(推荐)
2016/09/18 Javascript
基于jQuery实现一个marquee无缝滚动的插件
2017/03/09 Javascript
react-native中ListView组件点击跳转的方法示例
2017/09/30 Javascript
ajax前台后台跨域请求处理方式
2018/02/08 Javascript
支付宝小程序自定义弹窗dialog插件的实现代码
2018/11/30 Javascript
vue axios封装httpjs,接口公用配置拦截操作
2020/08/11 Javascript
JavaScript实现网页动态生成表格
2020/11/25 Javascript
[01:31:03]DOTA2完美盛典全回顾 见证十五项大奖花落谁家
2017/11/28 DOTA
Python2.x与Python3.x的区别
2016/01/14 Python
python网络编程之多线程同时接受和发送
2019/09/03 Python
Python基于Dlib的人脸识别系统的实现
2020/02/26 Python
python 列表推导和生成器表达式的使用
2021/02/01 Python
日本热销NO.1胶原蛋白冻:Aishitoto爱希特多
2019/06/20 全球购物
建筑设计所实习生自我鉴定
2013/09/25 职场文书
《菜园里》教学反思
2014/04/17 职场文书
贷款委托书
2014/08/01 职场文书
新闻学专业职业生涯规划范文:我的人生我做主
2014/09/12 职场文书
党在我心中的演讲稿
2014/09/13 职场文书
2014年生产管理工作总结
2014/12/23 职场文书
2015员工年度考核评语
2015/03/25 职场文书
2015年大学辅导员工作总结
2015/05/12 职场文书
超市主管竞聘书
2015/09/15 职场文书
2016大学生就业指导课心得体会
2016/01/15 职场文书
javascript函数式编程基础
2021/09/15 Javascript
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
2021/11/27 Vue.js