学习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 相关文章推荐
BBS(php &amp; mysql)完整版(二)
Oct 09 PHP
《APMServ 5.1.2》使用图解
Oct 23 PHP
PHP 5.0对象模型深度探索之属性和方法
Mar 27 PHP
php cout&amp;lt;&amp;lt;的一点看法
Jan 24 PHP
PHP json_encode中文乱码问题的解决办法
Sep 09 PHP
php使浏览器直接下载pdf文件的方法
Nov 15 PHP
thinkphp实现发送邮件密码找回功能实例
Dec 01 PHP
php操作memcache缓存方法分享
Jun 03 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
Oct 08 PHP
Yii框架实现多数据库配置和操作的方法
May 25 PHP
php设计模式之适配器模式原理、用法及注意事项详解
Sep 24 PHP
PHP字符串与数组处理函数用法小结
Jan 07 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
虹吸式咖啡壶操作
2021/03/03 冲泡冲煮
PHP对象转换为数组函数(递归方法)
2012/02/04 PHP
php字符串替换函数substr_replace()用法实例
2015/03/17 PHP
PHP 无限级分类
2017/05/04 PHP
在一个浏览器里呈现所有浏览器测试结果的前端测试工具的思路
2010/03/02 Javascript
基于jquery的超简单上下翻
2010/04/20 Javascript
JavaScript实现统计文本框Textarea字数增强用户体验
2012/12/21 Javascript
jQuery实现仿QQ在线客服效果的滚动层代码
2015/10/15 Javascript
JS表格组件神器bootstrap table详解(基础版)
2015/12/08 Javascript
jQuery的框架介绍
2016/05/11 Javascript
Bootstrap基本布局实现方法详解
2016/11/25 Javascript
jQuery Pagination分页插件使用方法详解
2017/02/28 Javascript
Vue.js如何实现路由懒加载浅析
2017/08/14 Javascript
基于vue.js实现的分页
2018/03/13 Javascript
简化vuex的状态管理方案的方法
2018/06/02 Javascript
vuejs简单验证码功能完整示例
2019/01/08 Javascript
小程序表单认证布局及验证详解
2020/06/19 Javascript
vue实现的多页面项目如何优化打包的步骤详解
2020/07/19 Javascript
vue实现把接口单独存放在一个文件方式
2020/08/13 Javascript
基于JS实现操作成功之后自动跳转页面
2020/09/25 Javascript
使用python绘制常用的图表
2016/08/27 Python
python tkinter窗口最大化的实现
2019/07/15 Python
Pandas DataFrame中的tuple元素遍历的实现
2019/10/23 Python
Python文本处理简单易懂方法解析
2019/12/19 Python
Python unittest生成测试报告过程解析
2020/09/08 Python
Sunglasses Shop荷兰站:英国最大的太阳镜独立在线零售商和供应商
2017/01/08 全球购物
意大利简约的休闲品牌:Aspesi
2018/02/08 全球购物
办公室文员自荐书
2014/02/03 职场文书
讲文明树新风演讲稿
2014/05/12 职场文书
学校运动会霸气口号
2014/06/07 职场文书
学校党的群众路线教育实践活动总结报告
2014/07/03 职场文书
股东合作协议书
2014/09/12 职场文书
病危通知书样本
2015/04/17 职场文书
高考诚信考试承诺书
2015/04/29 职场文书
酒吧七夕情人节宣传语
2015/11/24 职场文书
解析Java异步之call future
2021/06/14 Java/Android