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 相关文章推荐
动态网站web开发 PHP、ASP还是ASP.NET
Oct 09 PHP
ob_start(),ob_start('ob_gzhandler')使用
Dec 25 PHP
Blitz templates 最快的PHP模板引擎
Apr 06 PHP
sql注入与转义的php函数代码
Jun 17 PHP
解析php中获取url与物理路径的总结
Jun 21 PHP
强制PHP命令行脚本单进程运行的方法
Apr 15 PHP
浅析php适配器模式(Adapter)
Nov 25 PHP
推荐一本PHP程序猿都应该拜读的书
Dec 31 PHP
CodeIgniter生成静态页的方法
May 17 PHP
php 实现Hash表功能实例详解
Nov 29 PHP
php 数组元素快速去重
May 05 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
Sep 16 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制作简单的内容采集器的代码
2007/11/28 PHP
php守护进程 加linux命令nohup实现任务每秒执行一次
2011/07/04 PHP
PHP函数之日期时间函数date()使用详解
2013/09/09 PHP
php过滤html标记属性类用法实例
2014/09/23 PHP
php判断用户是否关注微信公众号
2016/07/22 PHP
使用ExtJS技术实现的拖动树结点
2010/08/05 Javascript
jquery下将选择的checkbox的id组成字符串的方法
2010/11/28 Javascript
Jquery为a标签的href赋值实现代码
2013/05/03 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
2016/09/28 Javascript
js实现文字列表无缝滚动效果
2017/06/23 Javascript
浅谈Vue.js 1.x 和 2.x 实例的生命周期
2017/07/25 Javascript
tracking.js页面人脸识别插件使用方法
2020/04/16 Javascript
5分钟教你用nodeJS手写一个mock数据服务器的方法
2019/09/10 NodeJs
jQuery操作动画完整实例分析
2020/01/10 jQuery
[50:01]Ti4 冒泡赛第二天 NEWBEE vs Titan
2014/07/15 DOTA
[03:15]DOTA2-DPC中国联赛1月22日Recap集锦
2021/03/11 DOTA
python遍历文件夹下所有excel文件
2018/01/03 Python
CentOS7.3编译安装Python3.6.2的方法
2018/01/22 Python
python ddt实现数据驱动
2018/03/14 Python
详解基于django实现的webssh简单例子
2018/07/17 Python
Django 静态文件配置过程详解
2019/07/23 Python
python FTP批量下载/删除/上传实例
2019/12/22 Python
信号生成及DFT的python实现方式
2020/02/25 Python
python GUI库图形界面开发之PyQt5输入对话框QInputDialog详细使用方法与实例
2020/02/27 Python
使用Python实现微信拍一拍功能的思路代码
2020/07/09 Python
HTML5 HTMLCollection和NodeList的区别详解
2020/04/29 HTML / CSS
HomeAway澳大利亚:预订你的度假屋,公寓、度假村、别墅等
2019/02/20 全球购物
工作自我评价分享
2013/12/01 职场文书
市场安全管理制度
2014/01/26 职场文书
出纳担保书范文
2014/04/02 职场文书
我爱我家教学反思
2014/05/01 职场文书
留守儿童工作方案
2014/06/02 职场文书
大学生个人总结范文
2015/02/15 职场文书
高中生自我评价范文2015
2015/03/03 职场文书
2016应届毕业生实习心得体会
2015/10/09 职场文书
教你使用Pandas直接核算Excel中快递费用
2021/05/12 Python