学习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 获取select下拉列表框的值
May 08 PHP
setcookie中Cannot modify header information-headers already sent by错误的解决方法详解
May 08 PHP
php生成html文件方法总结
Dec 01 PHP
php生成RSS订阅的方法
Feb 13 PHP
php数组函数array_key_exists()小结
Dec 10 PHP
php数据访问之查询关键字
May 09 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
Aug 17 PHP
php车辆违章查询数据示例
Oct 14 PHP
php base64 编码与解码实例代码
Mar 21 PHP
php实现socket推送技术的示例
Dec 20 PHP
PHP基于面向对象实现的留言本功能实例
Apr 04 PHP
PHP折半(二分)查找算法实例分析
May 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 mssql 分页SQL语句优化 持续影响
2009/04/26 PHP
linux系统下php安装mbstring扩展的二种方法
2014/01/20 PHP
PHP缓冲区用法总结
2016/02/14 PHP
php实现微信和支付宝支付的示例代码
2020/08/11 PHP
比较详细的javascript对象的property和prototype是什么一种关系
2007/08/06 Javascript
读jQuery之一(对象的组成)
2011/06/11 Javascript
JQuery中对服务器控件 DropdownList, RadioButtonList, CheckboxList的操作总结
2011/06/28 Javascript
Javascript 遮罩层和加载效果代码
2013/08/01 Javascript
javascript中数组中求最大值示例代码
2013/12/18 Javascript
登陆成功后自动计算秒数执行跳转
2014/01/23 Javascript
node.js正则表达式获取网页中所有链接的代码实例
2014/06/03 Javascript
nodejs npm包管理的配置方法及常用命令介绍
2014/06/05 NodeJs
JS对象与json字符串格式转换实例
2014/10/28 Javascript
一个用jquery写的判断div滚动条到底部的方法【推荐】
2016/04/29 Javascript
js利用appendChild对标签进行排序的实现方法
2016/10/16 Javascript
canvas实现图像布局填充功能
2017/02/06 Javascript
原生JS实现图片懒加载(lazyload)实例
2017/06/13 Javascript
ES6使用Set数据结构实现数组的交集、并集、差集功能示例
2017/10/31 Javascript
深入理解Vue 的钩子函数
2018/09/05 Javascript
Webstorm2016使用技巧(SVN插件使用)
2018/10/29 Javascript
layui固定下拉框的显示条数(有滚动条)的方法
2019/09/10 Javascript
Vue全局使用less样式,组件使用全局样式文件中定义的变量操作
2020/10/21 Javascript
Python实现检测服务器是否可以ping通的2种方法
2015/01/01 Python
python轻松查到删除自己的微信好友
2016/01/10 Python
Python3使用requests登录人人影视网站的方法
2016/05/11 Python
Python利用openpyxl库遍历Sheet的实例
2018/05/03 Python
python遍历文件夹,指定遍历深度与忽略目录的方法
2018/07/11 Python
Python实现京东秒杀功能代码
2019/05/16 Python
Python列表去重复项的N种方法(实例代码)
2020/05/12 Python
用OpenCV进行年龄和性别检测的实现示例
2021/01/29 Python
英国皇室御用百货:福南梅森(Fortnum & Mason)
2017/12/03 全球购物
分布式数据库需要考虑哪些问题
2013/12/08 面试题
运动会表扬稿大全
2014/01/16 职场文书
学生干部培训方案
2014/06/12 职场文书
2016年大学迎新工作总结
2015/10/14 职场文书
2019年消防宣传标语集锦
2019/11/21 职场文书