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 相关文章推荐
从网上搜到的phpwind 0day的代码
Dec 07 PHP
php 获取客户端的真实ip
Nov 30 PHP
第六章 php目录与文件操作
Dec 30 PHP
php常用字符串处理函数实例分析
Nov 22 PHP
WordPress中"无法将上传的文件移动至"错误的解决方法
Jul 01 PHP
PHP+ajax分页实例简析
Dec 07 PHP
Zend Framework教程之Autoloading用法详解
Mar 08 PHP
thinkPHP简单遍历数组方法分析
May 16 PHP
yii2缓存Caching基本用法示例
Jul 18 PHP
PHP设计模式之原型模式定义与用法详解
Apr 03 PHP
PHP CURL使用详解
Mar 21 PHP
从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解
Apr 03 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代码(抓取网页中的邮箱地址)
2012/07/17 PHP
ThinkPHP表单令牌错误的相关解决方法分析
2016/05/20 PHP
利用php生成验证码
2017/02/23 PHP
用JavaScript修改CSS属性的代码
2013/05/06 Javascript
javascript中直接引用Microsoft的COM生成Word
2014/01/20 Javascript
javaScript实现可缩放的显示区效果代码
2015/10/26 Javascript
JS实现直接运行html代码的方法
2017/03/13 Javascript
vue.js评论发布信息可插入QQ表情功能
2017/08/08 Javascript
使用D3.js创建物流地图的示例代码
2018/01/27 Javascript
vue项目中应用ueditor自定义上传按钮功能
2018/04/27 Javascript
bootstrap模态框关闭后清除模态框的数据方法
2018/08/10 Javascript
微信小程序中显示倒计时代码实例
2019/05/09 Javascript
JS中实现一个下载进度条及播放进度条的代码
2019/06/10 Javascript
JS实现的字符串数组去重功能小结
2019/06/17 Javascript
vuejs移动端实现div拖拽移动
2019/07/25 Javascript
解决vue-loader加载不上的问题
2020/10/21 Javascript
Python实现的简单文件传输服务器和客户端
2015/04/08 Python
总结Python编程中三条常用的技巧
2015/05/11 Python
python读取TXT到数组及列表去重后按原来顺序排序的方法
2015/06/26 Python
python生成器表达式和列表解析
2016/03/10 Python
scrapy爬虫实例分享
2017/12/28 Python
python2.7实现邮件发送功能
2018/12/12 Python
python定位xpath 节点位置的方法
2019/08/27 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
2020/06/23 Python
如何通过命令行进入python
2020/07/06 Python
利用Python批量识别电子账单数据的方法
2021/02/08 Python
CSS3实例分享--超炫checkbox复选框和radio单选框
2014/09/01 HTML / CSS
英国蜡烛、蜡烛配件和家居香氛购买网站:Yankee Candle
2018/12/12 全球购物
英语专业毕业生自我鉴定
2013/11/09 职场文书
投标授权委托书范文
2014/08/02 职场文书
2014基层党员批评与自我批评范文
2014/09/24 职场文书
常务副总经理岗位职责
2015/02/02 职场文书
MySql 缓存查询原理与缓存监控和索引监控介绍
2021/07/02 MySQL
Python+Matplotlib+LaTeX玩转数学公式
2022/02/24 Python
详解在OpenCV中如何使用图像像素
2022/03/03 Python
python超详细实现完整学生成绩管理系统
2022/03/17 Python