学习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 相关文章推荐
第九节--绑定
Nov 16 PHP
PHPMailer 中文使用说明小结
Jan 22 PHP
str_replace只替换一次字符串的方法
Apr 09 PHP
关于php正则匹配汉字的方法介绍
Apr 25 PHP
解析php根据ip查询所在地区(非常有用,赶集网就用到)
Jul 01 PHP
PHP5.3安装Zend Guard Loader图文教程
Sep 29 PHP
PHP内置的Math函数效率测试
Dec 01 PHP
php遍历替换目录下文件指定内容的方法
Nov 10 PHP
php compact 通过变量创建数组
Nov 15 PHP
php过滤输入操作之htmlentities与htmlspecialchars用法分析
Feb 17 PHP
php实现支付宝当面付(扫码支付)功能
May 30 PHP
PHP+redis实现的悲观锁机制示例
Jun 12 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读MYSQL中文乱码的解决方法
2006/12/17 PHP
PHP通过COM使用ADODB的简单例子
2006/12/31 PHP
php异常处理技术,顶级异常处理器
2012/06/13 PHP
PHP关联数组的10个操作技巧
2013/01/21 PHP
多广告投放代码 推荐
2006/11/13 Javascript
mapper--图片热点区域高亮组件官方站点
2007/12/22 Javascript
jquery ajax提交整个表单元素的快捷办法
2013/03/27 Javascript
初识Node.js
2015/03/20 Javascript
jQuery 3 中的新增功能汇总介绍
2016/06/12 Javascript
NODE.JS跨域问题的完美解决方案
2016/10/20 Javascript
JavaScript利用Date实现简单的倒计时实例
2017/01/12 Javascript
nodejs基础应用
2017/02/03 NodeJs
angular.js和vue.js中实现函数去抖示例(debounce)
2018/01/18 Javascript
jquery ui 实现 tab标签功能示例【测试可用】
2019/07/25 jQuery
Typescript的三种运行方式(小结)
2019/09/18 Javascript
[57:41]Secret vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python原始套接字编程示例分享
2014/02/21 Python
详解常用查找数据结构及算法(Python实现)
2016/12/09 Python
Python实现的十进制小数与二进制小数相互转换功能
2017/10/12 Python
分析经典Python开发工程师面试题
2019/04/08 Python
详解DeBug Python神级工具PySnooper
2019/07/03 Python
详解Python文件修改的两种方式
2019/08/22 Python
Python实现多线程下载脚本的示例代码
2020/04/03 Python
网站性能延迟加载图像的五种技巧(小结)
2020/08/13 HTML / CSS
如何减少垃圾回收让内存更加有效使用
2013/10/18 面试题
软件测试题目
2013/02/27 面试题
如何开发安全的AJAX应用
2014/03/26 面试题
查摆问题自我剖析材料
2014/08/18 职场文书
改革共识倡议书
2014/08/29 职场文书
大学感恩节活动策划方案
2014/10/11 职场文书
新党章的学习心得体会
2014/11/07 职场文书
2014年高中教师工作总结
2014/12/19 职场文书
会计入职心得体会
2016/01/22 职场文书
Python还能这么玩之用Python做个小游戏的外挂
2021/06/04 Python
详解Python+OpenCV绘制灰度直方图
2022/03/22 Python
阿里云日志过滤器配置日志服务
2022/04/09 Servers