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 strrpos()与strripos()函数
Aug 31 PHP
PHP取整函数:ceil,floor,round,intval的区别详细解析
Aug 31 PHP
PHP采集类Snoopy抓取图片实例
Jun 19 PHP
PHP实现服务器状态监控的方法
Dec 09 PHP
学习php设计模式 php实现观察者模式(Observer)
Dec 09 PHP
微信支付开发发货通知实例
Jul 12 PHP
PHP Mysqli 常用代码集合
Nov 12 PHP
php简单计算年龄的方法(周岁与虚岁)
Dec 06 PHP
Windows 下安装 swoole 图文教程(php)
Jun 05 PHP
PHP静态延迟绑定和普通静态效率的对比
Oct 20 PHP
PHP写API输出的时用echo的原因详解
Apr 28 PHP
Laravel框架查询构造器简单示例
May 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
PHP数组与对象之间使用递归实现转换的方法
2015/06/24 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
2015/09/20 PHP
php 基础函数
2017/02/10 PHP
PHP实现腾讯短网址生成api接口实例
2020/12/08 PHP
关于javascript中this关键字(翻译+自我理解)
2010/10/20 Javascript
Jquery知识点三 jquery表单对象操作
2011/01/17 Javascript
javascript实现图片循环渐显播放的方法
2015/02/24 Javascript
Bootstrap的基本应用要点浅析
2016/12/19 Javascript
JavaScript中transform实现数字翻页效果
2017/03/08 Javascript
详解Angular 4.x Injector
2017/05/04 Javascript
AngularJS点击添加样式、点击变色设置的实例代码
2017/07/27 Javascript
Echarts之悬浮框中的数据排序问题
2018/11/08 Javascript
通过实例了解JS执行上下文运行原理
2020/06/17 Javascript
python基础教程之python消息摘要算法使用示例
2014/02/10 Python
Python安装Imaging报错:The _imaging C module is not installed问题解决方法
2014/08/22 Python
Python3 log10()函数简单用法
2019/02/19 Python
Python制作词云图代码实例
2019/09/09 Python
python 和c++实现旋转矩阵到欧拉角的变换方式
2019/12/04 Python
新手学python应该下哪个版本
2020/06/11 Python
python利用platform模块获取系统信息
2020/10/09 Python
call在Python中改进数列的实例讲解
2020/12/09 Python
Merchant 1948澳大利亚:新西兰领先的鞋类和靴子供应商
2018/03/24 全球购物
美国在线旅行社:Crystal Travel
2018/09/11 全球购物
心得体会开头
2014/01/01 职场文书
恶搞卫生巾广告词
2014/03/18 职场文书
合作经营协议书
2014/04/17 职场文书
党的群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
校园新闻广播稿5篇
2014/10/10 职场文书
个人工作作风整改措施思想汇报
2014/10/13 职场文书
2015年组织部工作总结
2015/04/03 职场文书
2015年技术工作总结范文
2015/04/20 职场文书
文艺晚会开场白
2015/05/29 职场文书
煤矿安全学习心得体会
2016/01/18 职场文书
opencv 分类白天与夜景视频的方法
2021/06/05 Python
Python日志模块logging用法
2022/06/05 Python
js前端面试常见浏览器缓存强缓存及协商缓存实例
2022/06/21 Javascript