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和ACCESS写聊天室(十)
Oct 09 PHP
php smarty截取中文字符乱码问题?gb2312/utf-8
Nov 07 PHP
mysql,mysqli,PDO的各自不同介绍
Sep 19 PHP
php缩放gif和png图透明背景变成黑色的解决方法
Oct 14 PHP
php绘图之在图片上写中文和英文的方法
Jan 24 PHP
PHP在线书签系统分享
Jan 04 PHP
Thinkphp 空操作、空控制器、命名空间(详解)
May 05 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
Feb 07 PHP
Laravel框架Auth用户认证操作实例分析
Sep 29 PHP
ThinkPHP 框架实现的读取excel导入数据库操作示例
Apr 14 PHP
PHP number_format函数原理及实例解析
Jul 14 PHP
PHP解决高并发问题
Apr 01 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
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
javascript第一课
2007/02/27 Javascript
jQuery 选择器理解
2010/03/16 Javascript
jquery 延迟执行实例介绍
2013/08/20 Javascript
JS过滤url参数特殊字符的实现方法
2013/12/24 Javascript
js左右弹性滚动对联广告代码分享
2014/02/19 Javascript
我的Node.js学习之路(四)--单元测试
2014/07/06 Javascript
js中hash和ico的关联分析
2015/02/05 Javascript
学习使用grunt来打包JavaScript和CSS程序的教程
2016/01/04 Javascript
微信小程序 图片加载(本地,网路)实例详解
2017/03/10 Javascript
webpack配置文件和常用配置项介绍
2017/04/28 Javascript
JavaScript简单拖拽效果(1)
2017/05/17 Javascript
Vue 中批量下载文件并打包的示例代码
2017/11/20 Javascript
Angular实现的内置过滤器orderBy排序与模糊查询功能示例
2017/12/29 Javascript
详解Vue取消eslint语法限制
2018/08/04 Javascript
JS函数内部属性之arguments和this实例解析
2018/10/07 Javascript
iView框架问题整理小结
2018/10/16 Javascript
微信小程序调用微信支付接口的实现方法
2019/04/29 Javascript
JS实现小星星特效
2019/12/24 Javascript
对python中执行DOS命令的3种方法总结
2018/05/12 Python
Django中的文件的上传的几种方式
2018/07/23 Python
python 单线程和异步协程工作方式解析
2019/09/28 Python
在OpenCV里实现条码区域识别的方法示例
2019/12/04 Python
多个python文件调用logging模块报错误
2020/02/12 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
2020/06/03 Python
html5利用canvas实现颜色容差抠图功能
2019/12/23 HTML / CSS
苹果Mac升级:MacSales.com
2017/11/20 全球购物
澳大利亚人信任的清洁平台,您的私人管家:Jarvis
2020/12/25 全球购物
IGK Hair官网:喷雾、洗发水、护发素等
2020/11/03 全球购物
SQL Server 2000数据库的文件有哪些,分别进行描述。
2015/11/09 面试题
捐款倡议书范文
2014/02/02 职场文书
反对邪教标语
2014/06/30 职场文书
农行心得体会
2014/09/02 职场文书
领导参观欢迎词
2015/01/26 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
2016年习总书记讲话学习心得体会
2016/01/20 职场文书