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分页函数
Oct 09 PHP
php imagecreatetruecolor 创建高清和透明图片代码小结
May 15 PHP
PHP 飞信好友免费短信API接口开源版
Jul 22 PHP
php 创建以UNIX时间戳命名的文件夹(示例代码)
Mar 08 PHP
php判断数组元素中是否存在某个字符串的方法
Jun 14 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
Dec 15 PHP
PHP获取当前完整URL地址的函数
Dec 21 PHP
浅析Yii2集成富文本编辑器redactor实例教程
Apr 25 PHP
php获取当前月与上个月月初及月末时间戳的方法
Dec 05 PHP
php实现构建排除当前元素的乘积数组方法
Oct 06 PHP
使用PHPUnit进行单元测试并生成代码覆盖率报告的方法
Mar 08 PHP
浅谈PHP进程管理
Mar 08 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
PHP4之COOKIE支持详解
2006/10/09 PHP
PHP获取类中常量,属性,及方法列表的方法
2009/04/09 PHP
PHP中遍历stdclass object的实现代码
2011/06/09 PHP
php入门学习知识点六 PHP文件的读写操作代码
2011/07/14 PHP
php实现数组筛选奇数和偶数示例
2014/04/11 PHP
PHP中in_array函数使用的问题与解决办法
2016/09/11 PHP
PHP快速推送微信模板消息
2017/04/14 PHP
js检测客户端不是firefox则提示下载
2007/04/07 Javascript
javascript定时保存表单数据的代码
2011/03/17 Javascript
容易被忽略的JS脚本特性
2011/09/13 Javascript
jQuery回车实现登录简单实现
2013/08/20 Javascript
javascript获取xml节点的最大值(实现代码)
2013/12/11 Javascript
浮动的div自适应居中显示的js代码
2013/12/23 Javascript
JS实现适合于后台使用的动画折叠菜单效果
2015/09/21 Javascript
JS代码随机生成姓名、手机号、身份证号、银行卡号
2016/04/27 Javascript
jquery判断input值不为空的方法
2016/06/05 Javascript
Jquery+Ajax+xml实现中国地区选择三级联动菜单效果(推荐)
2017/06/09 jQuery
vue-cli3.0 脚手架搭建项目的过程详解
2018/10/19 Javascript
详解Vue中的scoped及穿透方法
2019/04/18 Javascript
javascript中的闭包概念与用法实践分析
2019/07/26 Javascript
JS实现随机抽选获奖者
2019/11/07 Javascript
JavaScript隐式类型转换代码实例
2020/05/29 Javascript
分享一下如何编写高效且优雅的 Python 代码
2017/09/07 Python
python先序遍历二叉树问题
2017/11/10 Python
Python Requests库基本用法示例
2018/08/20 Python
python实现三次样条插值
2018/12/17 Python
Iconfont(矢量图标)+iconmoon(图标svg互转)配合javascript实现社交分享系统
2020/04/21 Python
python中实现栈的三种方法
2020/12/19 Python
使用CSS3的ruby-position固定注音位置的用法示例
2016/07/05 HTML / CSS
只要五步 就可以用HTML5/CSS3快速制作便签贴特效(图)
2012/06/04 HTML / CSS
什么是索引指示器
2012/08/20 面试题
党员的自我评价范文
2014/01/02 职场文书
街道务虚会发言材料
2014/10/20 职场文书
运动会加油稿30字
2015/07/21 职场文书
唱歌比赛拉拉队口号
2015/12/25 职场文书
Vue中插槽slot的使用方法与应用场景详析
2021/06/08 Vue.js