学习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简介
Oct 09 PHP
PHP的array_diff()函数在处理大数组时的效率问题
Nov 27 PHP
基于php split()函数的用法详解
Jun 05 PHP
PHP语法自动检查的Vim插件
Aug 11 PHP
php禁止直接从浏览器输入地址访问.php文件的方法
Nov 04 PHP
PHP正则表达式之捕获组与非捕获组
Nov 06 PHP
Yii实现单用户博客系统文章详情页插入评论表单的方法
Dec 28 PHP
PHP汉字转换拼音的函数代码
Dec 30 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
May 20 PHP
php微信公众号开发之现金红包
Apr 16 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
Oct 27 PHP
基于ThinkPHP删除目录及目录文件函数
Oct 28 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
ubuntu10.04配置 nginx+php-fpm模式的详解
2013/06/03 PHP
PHP中使用json数据格式定义字面量对象的方法
2014/08/20 PHP
php生成短域名函数
2015/03/23 PHP
PHP的关于变量和日期处理的一些面试题目整理
2015/08/10 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
PHP swoole和redis异步任务实现方法分析
2019/08/12 PHP
使用自定义setTimeout和setInterval使之可以传递参数和对象参数
2009/04/24 Javascript
JavaScript动态创建link标签到head里的方法
2014/12/22 Javascript
jquery.map()方法的使用详解
2015/07/09 Javascript
js模仿php中strtotime()与date()函数实现方法
2015/08/11 Javascript
js实现新浪微博首页效果
2015/10/16 Javascript
javascript图片延迟加载实现方法及思路
2015/12/31 Javascript
Vue.js第二天学习笔记(vue-router)
2016/12/01 Javascript
react native与webview通信的示例代码
2017/09/25 Javascript
vue2实现数据请求显示loading图
2017/11/28 Javascript
基于Fixed定位的框选功能的实现代码
2019/05/13 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
layui 弹出层值回传解决方式
2019/11/14 Javascript
微信小程序自定义tabBar的踩坑实践记录
2020/11/06 Javascript
Flask实现跨域请求的处理方法
2018/09/27 Python
浅谈python的dataframe与series的创建方法
2018/11/12 Python
解决django后台样式丢失,css资源加载失败的问题
2019/06/11 Python
Python3+PyInstall+Sciter解决报错缺少dll、html等文件问题
2019/07/15 Python
python 并发下载器实现方法示例
2019/11/22 Python
Python绘制词云图之可视化神器pyecharts的方法
2021/02/23 Python
python实现不同数据库间数据同步功能
2021/02/25 Python
BCBG官网:BCBGMAXAZRIA
2017/12/29 全球购物
Parfumdreams芬兰:购买香水和化妆品
2021/02/13 全球购物
课例研修方案
2014/05/31 职场文书
宣传口号大全
2014/06/16 职场文书
人事专员岗位职责说明书
2014/07/30 职场文书
公安个人四风问题对照检查及整改措施
2014/10/28 职场文书
见习报告的格式
2014/11/04 职场文书
地道战观后感500字
2015/06/04 职场文书
2019销售早会主持词
2019/06/27 职场文书
python flask开发的简单基金查询工具
2021/06/02 Python