学习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 相关文章推荐
Windows 下的 PHP-PEAR 安装方法
Nov 20 PHP
php遍历文件夹和文件列表示例分享
Mar 11 PHP
php解决约瑟夫环示例
Apr 09 PHP
php中数字0和空值的区别分析
Jun 05 PHP
php基于curl扩展制作跨平台的restfule 接口
May 11 PHP
利用PHP脚本在Linux下用md5函数加密字符串的方法
Jun 29 PHP
php验证码实现代码(3种)
Sep 07 PHP
PHP中的数组处理函数实例总结
Jan 09 PHP
全面解析PHP面向对象的三大特征
Jun 10 PHP
PHP自定义序列化接口Serializable用法分析
Dec 29 PHP
PHP实现的一致性Hash算法详解【分布式算法】
Mar 31 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
Oct 17 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
Function eregi is deprecated (解决方法)
2013/06/21 PHP
详解PHP中的状态模式编程
2015/08/11 PHP
php rmdir使用递归函数删除非空目录实例详解
2016/10/20 PHP
PHP使用zlib扩展实现GZIP压缩输出的方法详解
2018/04/09 PHP
浅谈laravel aliases别名的原理
2019/10/24 PHP
JQuery EasyUI 对话框的使用方法
2010/10/24 Javascript
javascript 判断字符串是否包含某字符串及indexOf使用示例
2013/10/18 Javascript
浅谈利用JavaScript进行的DDoS攻击原理与防御
2015/06/04 Javascript
js实现的Easy Tabs选项卡用法实例
2015/09/06 Javascript
Vue Cli与BootStrap结合实现表格分页功能
2017/08/18 Javascript
详解Angular6学习笔记之主从组件
2018/09/05 Javascript
vue2.0 + ele的循环表单及验证字段方法
2018/09/18 Javascript
Vue2.0学习系列之项目上线的方法步骤(图文)
2018/09/25 Javascript
微信小程序页面缩放式侧滑效果的实现代码
2018/11/15 Javascript
Vue开发环境跨域访问问题
2020/01/22 Javascript
微信小程序调用wx.getImageInfo遇到的坑解决
2020/05/31 Javascript
Vant Weapp组件踩坑:picker的初始赋值解决
2020/11/12 Javascript
[03:07]【DOTA2亚洲邀请赛】我们,梦开始的地方
2017/03/07 DOTA
[06:49]2018DOTA2国际邀请赛寻真——VirtusPro傲视群雄
2018/08/12 DOTA
[55:26]DOTA2-DPC中国联赛 正赛 Aster vs LBZS BO3 第一场 2月23日
2021/03/11 DOTA
Python中内建函数的简单用法说明
2016/05/05 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
2016/07/02 Python
利用python对Excel中的特定数据提取并写入新表的方法
2018/06/14 Python
Django REST framework 分页的实现代码
2019/06/19 Python
python读取Excel表格文件的方法
2019/09/02 Python
python paramiko远程服务器终端操作过程解析
2019/12/14 Python
python else语句在循环中的运用详解
2020/07/06 Python
科尔士百货公司官网:Kohl’s
2016/07/11 全球购物
超市营业员岗位职责
2013/12/20 职场文书
高一家长会邀请函
2014/01/12 职场文书
行政管理毕业生自荐信
2014/02/24 职场文书
2016教师节感恩话语
2015/12/09 职场文书
OpenCV-Python 实现两张图片自动拼接成全景图
2021/06/11 Python
Redis性能监控的实现
2021/07/09 Redis
Python 的 sum() Pythonic 的求和方法详细
2021/10/16 Python
pandas中pd.groupby()的用法详解
2022/06/16 Python