学习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 相关文章推荐
基于mysql的论坛(6)
Oct 09 PHP
收集的php编写大型网站问题集
Mar 06 PHP
discuz的php防止sql注入函数
Jan 17 PHP
PHP二维数组的去重问题解析
Jul 17 PHP
深入PHP数据加密详解
Jun 18 PHP
6种php上传图片重命名的方法实例
Nov 04 PHP
php查看请求头信息获取远程图片大小的方法分享
Dec 25 PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
May 10 PHP
Yii中CGridView实现批量删除的方法
Dec 28 PHP
Mac下php 5升级到php 7的步骤详解
Apr 26 PHP
使用WAMP搭建PHP本地开发环境
May 10 PHP
php中请求url的五种方法总结
Jul 13 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的ob_start();控制您的浏览器cache!
2006/11/25 PHP
PHP配置文件中最常用四个ini函数
2007/03/19 PHP
Zend Framework入门教程之Zend_Config组件用法详解
2016/12/09 PHP
取得传值的函数
2006/10/27 Javascript
javascript 极速 隐藏/显示万行表格列只需 60毫秒
2009/03/28 Javascript
Jquery同辈元素选中/未选中效果的实例代码
2013/08/01 Javascript
JS+CSS实现Div弹出窗口同时背景变暗的方法
2015/03/04 Javascript
基于JS实现导航条之调用网页助手小精灵的方法
2016/06/17 Javascript
基于javascript的Form表单验证
2016/12/29 Javascript
jQuery EasyUI Panel面板组件使用详解
2017/02/28 Javascript
JavaScript之Canvas_动力节点Java学院整理
2017/07/04 Javascript
浅析JS中回调函数及用法
2018/07/25 Javascript
vue 基于element-ui 分页组件封装的实例代码
2018/12/10 Javascript
JavaScript类型相关的常用操作总结
2019/02/14 Javascript
使用Three.js实现太阳系八大行星的自转公转示例代码
2019/04/09 Javascript
Vue infinite update loop的问题解决
2019/04/23 Javascript
微信小程序实用代码段(收藏版)
2019/12/17 Javascript
用云开发Cloudbase实现小程序多图片内容安全监测的代码详解
2020/06/07 Javascript
Vue如何基于vue-i18n实现多国语言兼容
2020/07/17 Javascript
python中bisect模块用法实例
2014/09/25 Python
Python网络爬虫与信息提取(实例讲解)
2017/08/29 Python
Python简单I/O操作示例
2019/03/18 Python
python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用
2019/04/03 Python
PyQt5图形界面播放音乐的实例
2019/06/17 Python
Python基于time模块表示时间常用方法
2020/06/18 Python
Python LMDB库的使用示例
2021/02/14 Python
Stutterheim瑞典:瑞典高级外套时装品牌
2019/06/24 全球购物
质检的岗位职责
2013/11/17 职场文书
《雪地里的小画家》教学反思
2014/02/22 职场文书
幼儿园家长评语大全
2014/04/16 职场文书
全国优秀辅导员事迹材料
2014/05/14 职场文书
节约每一滴水演讲稿
2014/09/09 职场文书
国家助学金感谢信
2015/01/21 职场文书
邮政营业员岗位职责
2015/04/14 职场文书
导游词之西安骊山
2019/12/20 职场文书
刚学完怎么用Python实现定时任务,转头就跑去撩妹!
2021/06/05 Python