学习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 相关文章推荐
一个简洁的多级别论坛
Oct 09 PHP
PHP cron中的批处理
Sep 16 PHP
PHP5+UTF8多文件上传类
Oct 17 PHP
PHP 无限分类三种方式 非函数的递归调用!
Aug 26 PHP
PHP写UltraEdit插件脚本实现方法
Dec 26 PHP
TMDPHP 模板引擎使用教程
Mar 13 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
Jun 09 PHP
php实现excel中rank函数功能的方法
Jan 20 PHP
PHP中iconv函数转码时截断字符问题的解决方法
Jan 21 PHP
PHP编程基本语法快速入门手册
Jan 07 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
Mar 25 PHP
微信小程序和php的登录实现
Apr 01 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
PHP 工厂模式使用方法
2010/05/18 PHP
纯php打造的tab选项卡效果代码(不用js)
2010/12/29 PHP
PHP中SESSION使用中的一点经验总结
2012/03/30 PHP
深入php中var_dump方法的使用详解
2013/06/24 PHP
浅析php面向对象public private protected 访问修饰符
2013/06/30 PHP
php 魔术方法详解
2014/11/11 PHP
php使用curl获取header检测开启GZip压缩的方法
2018/08/15 PHP
php xhprof使用实例详解
2019/04/15 PHP
优化javascript的执行效率一些方法总结
2013/12/25 Javascript
js对table的td进行相同内容合并示例详解
2013/12/27 Javascript
Chrome下ifame父窗口调用子窗口的问题示例探讨
2014/03/17 Javascript
Javascript基础教程之while语句
2015/01/18 Javascript
jquery判断密码强度的验证代码
2020/04/22 Javascript
完美实现bootstrap分页查询
2015/12/09 Javascript
jQuery插件FusionCharts绘制2D柱状图和折线图的组合图效果示例【附demo源码】
2017/04/10 jQuery
使用vue与jquery实时监听用户输入状态的操作代码
2017/09/19 jQuery
JS实现自定义状态栏动画文字效果示例
2017/10/12 Javascript
vue radio单选框,获取当前项(每一项)的value值操作
2020/09/10 Javascript
Python测试网络连通性示例【基于ping】
2018/08/03 Python
django的model操作汇整详解
2019/07/26 Python
Python实现栈和队列的简单操作方法示例
2019/11/29 Python
Python 之 Json序列化嵌套类方式
2020/02/27 Python
如何使用Cython对python代码进行加密
2020/07/08 Python
CSS3点击按钮实现背景渐变动画效果
2016/10/19 HTML / CSS
html5拍照功能实现代码(htm5上传文件)
2013/12/11 HTML / CSS
英国领先的大码时装品牌之一:Elvi
2018/08/26 全球购物
英国行业制服供应商:Alexandra
2019/09/14 全球购物
简述数组与指针的区别
2014/01/02 面试题
类的返射机制中的包及核心类
2016/09/12 面试题
致1500米运动员广播稿
2014/02/07 职场文书
护理工作个人总结
2015/03/03 职场文书
不同意离婚答辩状
2015/05/22 职场文书
结婚纪念日感言
2015/08/01 职场文书
2016年安康杯竞赛活动总结
2016/04/05 职场文书
Python中Selenium对Cookie的操作方法
2021/07/09 Python
Vue自定义铃声提示音组件的实现
2022/01/22 Vue.js