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实现插入排序?
Apr 10 PHP
php中get_headers函数的作用及用法的详细介绍
Apr 27 PHP
通过PHP current函数获取未知字符键名数组第一个元素的值
Jun 24 PHP
php模拟ping命令(php exec函数的使用方法)
Oct 25 PHP
zf框架的db类select查询器join链表使用示例(zend框架)
Mar 14 PHP
php使用google地图应用实例
Dec 31 PHP
ThinkPHP表单数据智能写入create方法实例分析
Sep 27 PHP
yii2.0整合阿里云oss删除单个文件的方法
Sep 19 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
Dec 25 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
Feb 19 PHP
PHP xpath()函数讲解
Feb 11 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
May 14 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
WordPress主题制作中自定义头部的相关PHP函数解析
2016/01/08 PHP
PHP根据key删除数组中指定的元素
2019/02/28 PHP
用php定义一个数组最简单的方法
2019/10/04 PHP
JavaScript中的Location地址对象
2008/01/16 Javascript
jquery获取table中的某行全部td的内容方法
2013/03/08 Javascript
JS中引用百度地图并将百度地图的logo和信息去掉
2013/09/29 Javascript
JavaScript设计模式之外观模式介绍
2014/12/28 Javascript
javascript基本包装类型介绍
2015/04/10 Javascript
javascript常用方法总结
2015/05/14 Javascript
JavaScript Math.round() 方法
2015/12/18 Javascript
jQuery on()绑定动态元素出现的问题小结
2016/02/19 Javascript
轮播图组件js代码
2016/08/08 Javascript
angularjs实现猜大小功能
2017/10/23 Javascript
详解自定义ajax支持跨域组件封装
2018/02/08 Javascript
vue elementUI table 自定义表头和行合并的实例代码
2019/05/22 Javascript
微信小程序防止多次点击跳转(函数节流)
2019/09/19 Javascript
[45:16]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第一场 12.12
2020/12/16 DOTA
python使用xmlrpc实例讲解
2013/12/17 Python
python循环监控远程端口的方法
2015/03/14 Python
总结Python中逻辑运算符的使用
2015/05/13 Python
让Python代码更快运行的5种方法
2015/06/21 Python
Python实现将一个正整数分解质因数的方法分析
2017/12/14 Python
python调用java的jar包方法
2018/12/15 Python
Python找出列表中出现次数最多的元素三种方式
2020/02/24 Python
matplotlib教程——强大的python作图工具库
2020/10/15 Python
深入理解css属性的选择对动画性能的影响
2016/04/20 HTML / CSS
物流专业大学的自我评价
2014/01/11 职场文书
我的五年职业生涯规划
2014/01/23 职场文书
审计主管岗位职责
2014/01/31 职场文书
刘胡兰的英雄事迹材料
2014/02/11 职场文书
财政局党的群众路线教育实践活动整改方案
2014/09/21 职场文书
个人借条范本
2015/05/25 职场文书
2016年中学植树节活动总结
2016/03/16 职场文书
2016年读书月活动总结范文
2016/04/06 职场文书
如何使用Python实现一个简易的ORM模型
2021/05/12 Python
Android Canvas绘制文字横纵向对齐
2022/06/05 Java/Android