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 26 PHP
用PHP写的基于Memcache的Queue实现代码
Nov 27 PHP
PHP 图片水印类代码
Aug 27 PHP
浅析HTTP消息头网页缓存控制以及header常用指令介绍
Jun 28 PHP
PHP修改session_id示例代码
Jan 08 PHP
重新认识php array_merge函数
Aug 31 PHP
php中define用法实例
Jul 30 PHP
百万级别知乎用户数据抓取与分析之PHP开发
Sep 28 PHP
WordPress中邮件的一些修改和自定义技巧
Dec 15 PHP
PHP获取当前文件的父目录方法汇总
Jul 21 PHP
CI框架教程之优化验证码机制详解【验证码辅助函数】
Apr 16 PHP
PHP7 参数处理机制修改
Mar 09 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设置静态内容缓存时间的方法
2014/12/01 PHP
解读PHP的Yii框架中请求与响应的处理流程
2016/03/17 PHP
PHP 进度条函数的简单实例
2017/09/19 PHP
js显示时间 js显示最后修改时间
2013/01/02 Javascript
jQuery渐变发光导航菜单的实例代码
2013/03/27 Javascript
jQueryMobile之Helloworld与页面切换的方法
2015/02/04 Javascript
前端js文件合并的三种方式推荐
2016/05/19 Javascript
实例解析jQuery中proxy()函数的用法
2016/05/24 Javascript
jquery实现简单Tab切换菜单效果
2020/07/17 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
获取IE浏览器Cookie信息的方法
2017/01/23 Javascript
js实现功能比较全面的全选和多选
2017/03/02 Javascript
Bootstrap媒体对象学习使用
2017/03/07 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
vue项目实现github在线预览功能
2018/06/20 Javascript
Vue.js组件高级特性实例详解
2018/12/24 Javascript
js实现文字头像的生成代码
2020/03/07 Javascript
Vue项目打包编译优化方案
2020/09/16 Javascript
Python递归遍历列表及输出的实现方法
2015/05/19 Python
发布你的Python模块详解
2016/09/15 Python
Python探索之自定义实现线程池
2017/10/27 Python
谈谈python中GUI的选择
2018/03/01 Python
pandas分区间,算频率的实例
2019/07/04 Python
Python Django切换MySQL数据库实例详解
2019/07/16 Python
python图片剪裁代码(图片按四个点坐标剪裁)
2020/03/10 Python
英国最大的自有市场,比亚马逊便宜:Flubit
2019/03/19 全球购物
P D PAOLA法国官网:西班牙著名的珠宝首饰品牌
2020/02/15 全球购物
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
中层干部岗位职责
2013/12/18 职场文书
机关党员2014全国两会学习心得体会
2014/03/10 职场文书
消防安全宣传标语
2014/06/07 职场文书
医学专业毕业生求职信
2014/06/20 职场文书
仓库管理员岗位职责
2015/02/03 职场文书
Redis分布式锁Redlock的实现
2021/08/07 Redis
MongoDB修改oplog大小的四种方法
2022/04/11 MongoDB
Nginx如何获取自定义请求header头和URL参数详解
2022/07/23 Servers