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的ob_start();控制您的浏览器cache!
Feb 14 PHP
实用函数3
Nov 08 PHP
初学PHP的朋友 经常问的一些问题。不断更新
Aug 11 PHP
比file_get_contents稳定的curl_get_contents分享
Jan 11 PHP
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
Feb 04 PHP
MySQL时间字段究竟使用INT还是DateTime的说明
Feb 27 PHP
PHP执行Curl时报错提示CURL ERROR: Recv failure: Connection reset by peer的解决方法
Jun 26 PHP
PHP中仿制 ecshop验证码实例
Jan 06 PHP
PHP中常用的魔术方法
Apr 28 PHP
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
Oct 11 PHP
实例讲解php实现多线程
Jan 27 PHP
PDO::exec讲解
Jan 28 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中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
深入理解require与require_once与include以及include_once的区别
2013/06/05 PHP
php根据日期或时间戳获取星座信息和生肖等信息
2015/10/20 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
js 操作css实现代码
2009/06/11 Javascript
游览器中javascript的执行过程(图文)
2012/05/20 Javascript
Extjs3.0 checkboxGroup 动态添加item实现思路
2013/08/14 Javascript
jquery中获取id值方法小结
2013/09/22 Javascript
jQuery 快速结束当前正在执行的动画
2013/11/20 Javascript
jQuery获取样式中颜色值的方法
2015/01/29 Javascript
解决node-webkit 不支持html5播放mp4视频的方法
2015/03/11 Javascript
JavaScript中日期的相关操作方法总结
2015/10/24 Javascript
JS实现图片高亮展示效果实例
2015/11/24 Javascript
使用nodejs+express实现简单的文件上传功能
2017/12/27 NodeJs
vue.js实现标签页切换效果
2018/06/07 Javascript
详解vue几种主动刷新的方法总结
2019/02/19 Javascript
微信小程序防止多次点击跳转(函数节流)
2019/09/19 Javascript
js实现无缝轮播图效果
2020/03/09 Javascript
40行代码把Vue3的响应式集成进React做状态管理
2020/05/20 Javascript
js实现可爱的气泡特效
2020/09/05 Javascript
[52:20]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
OpenCV+python手势识别框架和实例讲解
2018/08/03 Python
对IPython交互模式下的退出方法详解
2019/02/16 Python
Python动态赋值的陷阱知识点总结
2019/03/17 Python
PyQt QCombobox设置行高的方法
2019/06/20 Python
Python单元测试与测试用例简析
2019/11/09 Python
python图形界面开发之wxPython树控件使用方法详解
2020/02/24 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
2020/03/08 Python
详解Flask前后端分离项目案例
2020/07/24 Python
css3 伪类选择器快速复习小结
2019/09/10 HTML / CSS
美国最大的在线寄售和旧货店:Swap.com
2018/08/27 全球购物
德国最新街头服饰网上商店:BODYCHECK
2019/09/15 全球购物
学前教育专业毕业生自荐信
2013/10/03 职场文书
争先创优公开承诺书
2014/08/30 职场文书
小学生作文评语集锦
2014/12/25 职场文书
win10电脑老是死机怎么办?win10系统老是死机的解决方法
2022/08/05 数码科技