学习php设计模式 php实现装饰器模式(decorator)


Posted in PHP onDecember 07, 2015

动态的给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活【GOF95】
装饰模式是以对客户透明的方式动态地给一个对象附加上更多的职责。这也就是说,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展。
一、装饰模式结构图

 学习php设计模式 php实现装饰器模式(decorator)

二、装饰模式中主要角色
抽象构件(Component)角色:定义一个对象接口,以规范准备接收附加职责的对象,从而可以给这些对象动态地添加职责。
具体构件(Concrete Component)角色:定义一个将要接收附加职责的类。
装饰(Decorator)角色:持有一个指向Component对象的指针,并定义一个与Component接口一致的接口。
具体装饰(Concrete Decorator)角色:负责给构件对象增加附加的职责。
三、装饰模式的优缺点
装饰模式的优点:
1、比静态继承更灵活;
2、避免在层次结构高层的类有太多的特征
装饰模式的缺点:
1、使用装饰模式会产生比使用继承关系更多的对象。并且这些对象看上去都很想像,从而使得查错变得困难。
四、装饰模式适用场景
1、在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
2、处理那些可以撤消的职责,即需要动态的给一个对象添加功能并且这些功能是可以动态的撤消的。
3、当不能彩生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
五、装饰模式PHP示例

<?php
/**
 * 抽象构件角色
 */
interface Component {
 /**
  * 示例方法
  */
 public function operation();
}
 
/**
 * 装饰角色
 */
abstract class Decorator implements Component{
 
 protected $_component;
 
 public function __construct(Component $component) {
  $this->_component = $component;
 }
 
 public function operation() {
  $this->_component->operation();
 }
}
 
/**
 * 具体装饰类A
 */
class ConcreteDecoratorA extends Decorator {
 public function __construct(Component $component) {
  parent::__construct($component);
 
 }
 
 public function operation() {
  parent::operation(); // 调用装饰类的操作
  $this->addedOperationA(); // 新增加的操作
 }
 
 /**
  * 新增加的操作A,即装饰上的功能
  */
 public function addedOperationA() {
  echo 'Add Operation A <br />';
 }
}
 
/**
 * 具体装饰类B
 */
class ConcreteDecoratorB extends Decorator {
 public function __construct(Component $component) {
  parent::__construct($component);
 
 }
 
 public function operation() {
  parent::operation();
  $this->addedOperationB();
 }
 
 /**
  * 新增加的操作B,即装饰上的功能
  */
 public function addedOperationB() {
  echo 'Add Operation B <br />';
 }
}
 
/**
 * 具体构件
 */
class ConcreteComponent implements Component{
 
 public function operation() {
  echo 'Concrete Component operation <br />';
 }
 
}
 
/**
 * 客户端
 */
class Client {
 
  /**
  * Main program.
  */
 public static function main() {
  $component = new ConcreteComponent();
  $decoratorA = new ConcreteDecoratorA($component);
  $decoratorB = new ConcreteDecoratorB($decoratorA);
 
  $decoratorA->operation();
  $decoratorB->operation();
 }
 
}
 
Client::main();
?>

以上就是使用php实现装饰模式的代码,还有一些关于装饰模式的概念区分,希望对大家的学习有所帮助。

PHP 相关文章推荐
用PHP读取IMAP邮件
Oct 09 PHP
我的论坛源代码(四)
Oct 09 PHP
PHP编实现程动态图像的创建代码
Sep 28 PHP
PHP 身份证号验证函数
May 07 PHP
php中static静态变量的使用方法详解
Jun 04 PHP
PHP面向对象分析设计的61条军规小结
Jul 17 PHP
PHP四舍五入、取整、round函数使用示例
Feb 06 PHP
PHP实现获取文件后缀名的几种常用方法
Aug 08 PHP
PHP Imagick完美实现图片裁切、生成缩略图、添加水印
Feb 22 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
Jul 20 PHP
php正则判断是否为合法身份证号的方法
Mar 16 PHP
PHP单例模式数据库连接类与页面静态化实现方法
Mar 20 PHP
PHP函数func_num_args用法实例分析
Dec 07 #PHP
学习php设计模式 php实现抽象工厂模式
Dec 07 #PHP
php计划任务之验证是否有多个进程调用同一个job的方法
Dec 07 #PHP
学习php设计模式 php实现建造者模式
Dec 07 #PHP
学习php设计模式 php实现访问者模式(Visitor)
Dec 07 #PHP
PHP面向对象详解(三)
Dec 07 #PHP
php生成高清缩略图实例详解
Dec 07 #PHP
You might like
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
JavaScript面象对象设计
2008/04/28 Javascript
JavaScript 原型继承之构造函数继承
2011/08/26 Javascript
document.getElementById介绍
2011/09/13 Javascript
JavaScript中this的使用详解
2013/11/08 Javascript
js判断字符长度以及中英文数字等
2013/12/31 Javascript
js中小数转换整数的方法
2014/01/26 Javascript
js使用for循环与innerHTML获取选中tr下td值
2014/09/26 Javascript
详解jquery中$.ajax方法提交表单
2014/11/03 Javascript
JavaScript中具名函数的多种调用方式总结
2014/11/08 Javascript
jQuery实现Flash效果上下翻动的中英文导航菜单代码
2015/09/22 Javascript
所见即所得的富文本编辑器bootstrap-wysiwyg使用方法详解
2016/05/27 Javascript
关于JS变量和作用域详解
2016/07/28 Javascript
关于JavaScript中事件绑定的方法总结
2016/10/26 Javascript
详解VUE的状态控制与延时加载刷新
2017/03/27 Javascript
d3.js实现立体柱图的方法详解
2017/04/28 Javascript
详解如何在Angular中快速定位DOM元素
2017/05/17 Javascript
详解javascript中的变量提升和函数提升
2018/05/24 Javascript
微信小程序iBeacon测距及稳定程序的实现解析
2019/07/31 Javascript
vue+elementUi 实现密码显示/隐藏+小图标变化功能
2020/01/18 Javascript
JavaScript交换变量的常用方法小结【4种方法】
2020/05/07 Javascript
24个ES6方法解决JS实际开发问题(小结)
2020/05/31 Javascript
前端vue+elementUI如何实现记住密码功能
2020/09/20 Javascript
python实现的登录和操作开心网脚本分享
2014/07/09 Python
python 日期操作类代码
2018/05/05 Python
Python3爬虫爬取百姓网列表并保存为json功能示例【基于request、lxml和json模块】
2018/12/05 Python
wxPython实现列表增删改查功能
2019/11/19 Python
pandas读取csv文件提示不存在的解决方法及原因分析
2020/04/21 Python
Css3实现无缝滚动防抖
2020/09/14 HTML / CSS
美国奢侈品购物平台:Orchard Mile
2018/05/02 全球购物
市场营销方案范文
2014/03/11 职场文书
医疗纠纷协议书
2014/04/16 职场文书
2016年五四青年节校园广播稿
2015/12/17 职场文书
《月球之谜》教学反思
2016/02/20 职场文书
2019关于实习生工作安排及待遇的管理方案!
2019/07/16 职场文书
微信小程序实现轮播图指示器
2022/06/25 Javascript