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
php 数学运算验证码实现代码
Oct 11 PHP
Php Mssql操作简单封装支持存储过程
Dec 11 PHP
php 5.3.5安装memcache注意事项小结
Apr 12 PHP
一个PHP缓存类代码(附详细说明)
Jun 09 PHP
PHP 图片水印类代码
Aug 27 PHP
解决php使用异步调用获取数据时出现(错误c00ce56e导致此项操作无法完成)
Jul 03 PHP
destoon实现会员商铺中指定会员或会员组投放广告的方法
Aug 21 PHP
php生成验证码函数
Oct 20 PHP
标准版Eclipse搭建PHP环境的详细步骤
Nov 18 PHP
Yii2增删改查之查询 where参数详细介绍
Aug 08 PHP
小程序微信退款功能实现方法详解【基于thinkPHP】
May 05 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中批量替换文件名的实现代码
2011/07/20 PHP
用JavaScript获取网页中的js、css、Flash等文件
2006/12/20 Javascript
jQuery初学:find()方法及children方法的区别分析
2011/01/31 Javascript
js确定对象类型方法
2012/03/30 Javascript
关于JS控制代码暂停的实现方法分享
2012/10/11 Javascript
jquery 关于event.target使用的几点说明介绍
2013/04/26 Javascript
js时间戳格式化成日期格式的多种方法
2013/11/11 Javascript
JQuery判断HTML元素是否存在的两种解决方法
2013/12/26 Javascript
js 数组操作之pop,push,unshift,splice,shift
2014/01/29 Javascript
javascript移动设备Web开发中对touch事件的封装实例
2014/06/05 Javascript
JavaScript操作Oracle数据库示例
2015/03/06 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
JS触摸屏网页版仿app弹窗型滚动列表选择器/日期选择器
2016/10/30 Javascript
jQuery animate()实现背景色渐变效果的处理方法【使用jQuery.color.js插件】
2017/03/15 Javascript
NW.js 简介与使用方法
2018/02/01 Javascript
基于JS实现html中placeholder属性提示文字效果示例
2018/04/19 Javascript
JavaScript基础教程之如何实现一个简单的promise
2018/09/11 Javascript
使用vue-cli webpack 快速搭建项目的代码
2018/11/21 Javascript
Python中的time模块与datetime模块用法总结
2016/06/30 Python
python获取当前运行函数名称的方法实例代码
2017/04/06 Python
python3.x上post发送json数据
2018/03/04 Python
Python下调用Linux的Shell命令的方法
2018/06/12 Python
超简单使用Python换脸实例
2019/03/27 Python
django中使用Celery 布式任务队列过程详解
2019/07/29 Python
python+tkinter实现学生管理系统
2019/08/20 Python
python3 selenium自动化 下拉框定位的例子
2019/08/23 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
2021/01/28 Python
基于HTML5实现类似微信手机摇一摇功能(计算摇动次数)
2017/07/24 HTML / CSS
来自圣地亚哥的实惠太阳镜:Knockaround
2018/08/27 全球购物
澳大利亚儿童鞋在线:The Trybe
2019/07/16 全球购物
Ego Shoes官网:英国时髦鞋类品牌
2020/10/19 全球购物
“九一八事变纪念日”国旗下讲话稿
2014/09/14 职场文书
清明节随笔
2015/08/15 职场文书
JDBC连接的六步实例代码(与mysql连接)
2021/05/12 MySQL
Python中文纠错的简单实现
2021/07/07 Python
mysql中整数数据类型tinyint详解
2021/12/06 MySQL