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 相关文章推荐
NOD32 v2.70.32 简体中文封装版 提供下载了
Feb 27 PHP
php桌面中心(四) 数据显示
Mar 11 PHP
PHP中::、->、self、$this几种操作符的区别介绍
Apr 24 PHP
php使用curl模拟登录后采集页面的例子
Nov 04 PHP
php+mysql实现数据库随机重排实例
Oct 17 PHP
一个经典实用的PHP图像处理类分享
Nov 18 PHP
实例讲解yii2.0在php命令行中运行的步骤
Dec 01 PHP
PHP+JS三级菜单联动菜单实现方法
Feb 24 PHP
Yii视图CGridView列表用法实例分析
Jul 12 PHP
PHP实现的防止跨站和xss攻击代码【来自阿里云】
Jan 29 PHP
Yii2处理密码加密及验证的方法
May 12 PHP
Laravel5.1 框架Middleware中间件基本用法实例分析
Jan 04 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
2006/12/13 PHP
关于BIG5-HKSCS的解决方法
2007/03/20 PHP
在php MYSQL中插入当前时间
2008/04/06 PHP
php 各种应用乱码问题的解决方法
2010/05/09 PHP
set_exception_handler函数在ThinkPHP中的用法
2014/10/31 PHP
IIS下PHP的三种配置方式对比
2014/11/20 PHP
php中http与https跨域共享session的解决方法
2014/12/20 PHP
php禁止某ip或ip地址段访问的方法
2015/02/25 PHP
PHP使用FFmpeg获取视频播放总时长与码率等信息
2016/09/13 PHP
微信公众平台开发-微信服务器IP接口实例(含源码)
2017/03/05 PHP
PHP封装XML和JSON格式数据接口操作示例
2019/03/06 PHP
详解php中curl返回false的解决办法
2019/03/18 PHP
laravel 之 Eloquent 模型修改器和序列化示例
2019/10/17 PHP
javascript removeChild 使用注意事项
2009/04/11 Javascript
javascript Keycode对照表
2009/10/24 Javascript
javascript按位非运算符的使用方法
2013/11/14 Javascript
jQuery实现html元素拖拽
2015/07/21 Javascript
JS实现的系统调色板完整实例
2016/12/21 Javascript
javascript实现用户点击数量统计
2016/12/25 Javascript
JS闭包用法实例分析
2017/03/27 Javascript
JavaScript实现左侧菜单效果
2017/12/14 Javascript
微信小程序冒泡事件及其阻止方法实例分析
2018/12/06 Javascript
webpack-url-loader 解决项目中图片打包路径问题
2019/02/15 Javascript
深入探索VueJS Scoped CSS 实现原理
2019/09/23 Javascript
浅谈鸿蒙 JavaScript GUI 技术栈
2020/09/17 Javascript
Vue使用Element实现增删改查+打包的步骤
2020/11/25 Vue.js
[01:45:05]VGJ.T vs Newbee Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
python根据距离和时长计算配速示例
2014/02/16 Python
python3实现windows下同名进程监控
2018/06/21 Python
python2.7使用scapy发送syn实例
2020/05/05 Python
python 元组的使用方法
2020/06/09 Python
Django Session和Cookie分别实现记住用户登录状态操作
2020/07/02 Python
Myprotein法国官网:欧洲第一运动营养品牌
2019/03/26 全球购物
什么是数据库锁?Oracle中都有哪些类型的锁?
2015/08/21 面试题
老人与海读书笔记
2015/06/26 职场文书
python基础之函数的定义和调用
2021/10/24 Python