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 相关文章推荐
mysql limit查询优化分析
Nov 12 PHP
window+nginx+php环境配置 附配置搭配说明
Dec 29 PHP
PHP实现手机归属地查询API接口实现代码
Aug 27 PHP
美图秀秀web开放平台--PHP流式上传和表单上传示例分享
Jun 22 PHP
thinkPHP实现表单自动验证
Dec 24 PHP
php给一组指定关键词添加span标签的方法
Mar 31 PHP
一个完整的php文件上传类实例讲解
Oct 27 PHP
PHP判断数组是否为空的常用方法(五种方法)
Feb 08 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
Aug 01 PHP
thinkPHP3.2.2框架行为扩展及demo示例
Jun 19 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
Feb 12 PHP
Laravel基础_关于view共享数据的示例讲解
Oct 14 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和数据库结合的一个简单的web实例 代码分析 (php初学者)
2011/07/28 PHP
destoon安装出现Internal Server Error的解决方法
2014/06/21 PHP
php模板引擎技术简单实现
2016/03/15 PHP
使弱类型的语言JavaScript变强势
2009/06/22 Javascript
原生JavaScript编写俄罗斯方块
2015/03/30 Javascript
js调用百度地图及调用百度地图的搜索功能
2015/09/07 Javascript
JavaScript事件处理的方式(三种)
2016/04/26 Javascript
AngularJS基础 ng-class-odd 指令示例
2016/08/01 Javascript
js常用DOM方法详解
2017/02/04 Javascript
实例解析js中try、catch、finally的执行规则
2017/02/24 Javascript
详解在Vue中通过自定义指令获取dom元素
2017/03/04 Javascript
VUE2.0+Element-UI+Echarts封装的组件实例
2018/03/02 Javascript
详解vuex中mapState,mapGetters,mapMutations,mapActions的作用
2018/04/13 Javascript
深入浅析JS中的严格模式
2018/06/04 Javascript
Angularjs中的$apply及优化使用详解
2018/07/02 Javascript
微信小程序实现聊天对话(文本、图片)功能
2018/07/06 Javascript
在小程序中使用Echart图表的示例代码
2018/08/02 Javascript
解决vuecli3.0热更新失效的问题
2018/09/19 Javascript
微信小程序实现的图片保存功能示例
2019/04/24 Javascript
深入浅出vue图片路径的实现
2019/09/04 Javascript
python利用高阶函数实现剪枝函数
2018/03/20 Python
python基础教程项目三之万能的XML
2018/04/02 Python
基于pip install django失败时的解决方法
2018/06/12 Python
Django项目创建到启动详解(最全最详细)
2019/09/07 Python
python 利用Pyinstaller打包Web项目
2020/10/23 Python
html5模拟平抛运动(模拟小球平抛运动过程)
2013/07/25 HTML / CSS
耐克巴西官方网站:Nike巴西
2016/08/14 全球购物
支票、地址标签、包装纸和慰问卡:Current Catalog
2018/01/30 全球购物
几个数据库方面的面试题
2016/07/01 面试题
Unix如何添加新的用户
2014/08/20 面试题
学校招生宣传广告词
2014/03/19 职场文书
如何写一份好的英文求职信
2014/03/19 职场文书
爱国主义演讲稿
2014/05/07 职场文书
任命书格式
2014/06/05 职场文书
Python机器学习应用之基于线性判别模型的分类篇详解
2022/01/18 Python
docker 制作mysql镜像并自动安装
2022/05/20 Servers