php设计模式之装饰模式应用案例详解


Posted in PHP onJune 17, 2019

本文实例讲述了php设计模式之装饰模式。分享给大家供大家参考,具体如下:

介绍

  • 装饰者模式(Decorator Pattern)允许你向一个现有的对象添加新的功能,同时又不改变其结构。 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
  • 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

主要角色

  • 抽象构件(Component)角色:定义一个独享接口,以规范准备接收附加职责的对象,从而可以给这些对象动态的添加职责。
  • 具体构件(Concrete Component)角色:定义一个将要接收附加职责的类。
  • 装饰(Decorator)角色:持有一个指向Component对象的指针,并定义一个与Component接口一致的接口。
  • 具体装饰(Concrete Decorator)角色:负责给构件对象增加附加的职责。

下面是使用装饰模式的一个简单实现:

class RequestHelper{}
abstract class ProcessRequest{
  abstract function process(RequestHelper $req);
}
class MainProcess extends ProcessRequest{
  function process(RequestHelper $req)
  {
    print __CLASS__.": doing something useful with request\n";
  }
}
abstract class DecorateProcess extends ProcessRequest{
  protected $processRequest;
  function __construct(ProcessRequest $pr)
  {
    $this->processRequest = $pr;
  }
}

和之前一样,我们定义了一个抽象基类(ProcessRequest)、一个具体的组件(MainProcess)和一个抽象装饰类(DecorateProcess)。 MainProcess::process()方法仅仅报告方法被调用,并没有其他功能。DecorateProcess为他的子类保存了一个ProcessRequest对象。下面是一些简单的具体装饰类:

class LogRequest extends DecorateProcess{
  function process(RequestHelper $req)
  {
    print __CLASS__.": logging request\n";
    $this->processRequest->process($req);
  }
}
class AuthenticateRequest extends DecorateProcess{
  function process(RequestHelper $req)
  {
    print __CLASS__.": authenticating request\n";
    $this->processRequest->process($req);
  }
}
class StructureRequest extends DecorateProcess{
  function process(RequestHelper $req)
  {
    print __CLASS__.": structuring request\n";
    $this->processRequest->process($req);
  }
}

装饰类的每一个process()方法在调用引用的processRequest对象的Process()方法前输出一条信息。

现在我们可以在运行时合并这些类的对象,创建过滤器来对每一个请求按不同的顺序执行不同操作。下面的代码将所有具体类的对象组合成为一个过滤器:

$process = new AuthenticateRequest(new StructureRequest(
  new LogRequest(
    new MainProcess()
  )));
$process->process(new RequestHelper());

执行代码会得到下面的输出结果:

Authenticate
Request: authenticating request
StructureRequest: structuring request
LogRequest: logging request
MainProcess: doing something useful with request

优点:

装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个代替模式,装饰模式可以动态扩展一个实现类的功能。

缺点:

多层装饰比较负责。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
让PHP支持页面回退的两种方法[转]
Feb 14 PHP
详解PHP显示MySQL数据的三种方法
Jun 05 PHP
php 智能404跳转代码,适合换域名没改变目录的网站
Jun 04 PHP
Php Image Resize图片大小调整的函数代码
Jan 17 PHP
对于PHP 5.4 你必须要知道的
Aug 07 PHP
php操作xml入门之cdata区段
Jan 23 PHP
ThinkPHP表单数据智能写入create方法实例分析
Sep 27 PHP
PHP中Enum(枚举)用法实例详解
Dec 07 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
Apr 20 PHP
php版交通银行网银支付接口开发入门教程
Sep 26 PHP
Zend Framework数据库操作方法实例总结
Dec 11 PHP
浅谈如何提高PHP代码质量之单元测试
May 28 PHP
php设计模式之策略模式应用案例详解
Jun 17 #PHP
PHP实现将上传图片自动缩放到指定分辨率,并保持清晰度封装类示例
Jun 17 #PHP
PHP 并发场景的几种解决方案
Jun 14 #PHP
PHP 实现文件压缩解压操作的方法
Jun 14 #PHP
php反射学习之依赖注入示例
Jun 14 #PHP
php反射学习之不用new方法实例化类操作示例
Jun 14 #PHP
PHP反射学习入门示例
Jun 14 #PHP
You might like
PHP+jQuery 注册模块的改进(一):验证码存入SESSION
2014/10/14 PHP
PHP中的正则表达式实例详解
2017/04/25 PHP
PHP数组常用函数实例小结
2018/08/20 PHP
JavaScript 面向对象的 私有成员和公开成员
2010/05/13 Javascript
基于jQuery实现表格数据的动态添加与统计的代码
2011/01/31 Javascript
JavaScript地图拖动功能SpryMap的简单实现
2013/07/17 Javascript
JavaScript中使用typeof运算符需要注意的几个坑
2014/11/08 Javascript
js实现进度条的方法
2015/02/13 Javascript
jquery实现的伪分页效果代码
2015/10/29 Javascript
JavaScript如何实现组合列表框中元素移动效果
2016/03/01 Javascript
基于bootstrap实现广告轮播带图片和文字效果
2016/07/22 Javascript
在微信、支付宝、百度钱包实现点击返回按钮关闭当前页面和窗口的方法
2016/08/05 Javascript
two.js之实现动画效果示例
2017/11/06 Javascript
详解express + mock让前后台并行开发
2018/06/06 Javascript
AngularJs分页插件使用详解
2018/06/30 Javascript
JavaScript控制浏览器全屏显示简单示例
2018/07/05 Javascript
Vue3 源码导读(推荐)
2019/10/14 Javascript
node.js文件操作系统实例详解
2019/11/05 Javascript
Vue中keep-alive组件的深入理解
2020/08/23 Javascript
使用python将mdb数据库文件导入postgresql数据库示例
2014/02/17 Python
PyTorch搭建一维线性回归模型(二)
2019/05/22 Python
python 画图 图例自由定义方式
2020/04/17 Python
html5 div布局与table布局详解
2016/11/16 HTML / CSS
Urban Outfitters英国官网:美国平价服饰品牌
2016/11/25 全球购物
说出数据连接池的工作机制是什么?
2013/04/19 面试题
C#面试题问题集
2016/04/02 面试题
简述安装Slackware Linux系统的过程
2012/01/12 面试题
新领导上任欢迎词
2014/01/13 职场文书
大学同学聚会邀请函
2014/01/29 职场文书
厨房管理计划书
2014/04/27 职场文书
教师读书活动总结
2014/05/07 职场文书
承诺书范本
2015/01/21 职场文书
酒店工程部经理岗位职责
2015/04/09 职场文书
2016年全国爱眼日宣传教育活动总结
2016/04/05 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书
解决Mysql中的innoDB幻读问题
2022/04/29 MySQL