学习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基础知识:控制结构
Dec 13 PHP
mysql时区问题
Mar 26 PHP
PHP swfupload图片上传的实例代码
Sep 30 PHP
百度地图API应用之获取用户的具体位置
Jun 10 PHP
PHP中的替代语法简介
Aug 22 PHP
PHP使用ob_start生成html页面的方法
Nov 07 PHP
PHP+APACHE实现网址伪静态
Feb 22 PHP
php通过asort()给关联数组按照值排序的方法
Mar 18 PHP
php 问卷调查结果统计
Oct 08 PHP
PHP实践教程之过滤、验证、转义与密码详解
Jul 24 PHP
php提取微信账单的有效信息
Oct 01 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
2020年4月新番动漫目录 官方宣布4月播出的作品一览
2020/03/08 日漫
?生?D片??C字串
2006/12/06 PHP
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
2009/03/13 PHP
php字符串按照单词进行反转的方法
2015/03/14 PHP
jQuery中after的两种用法实例
2013/07/03 Javascript
js jquery获取随机生成id的服务器控件的三种方法
2013/07/11 Javascript
jQuery Mobile的loading对话框显示/隐藏方法分享
2013/11/26 Javascript
jQuery+css实现的蓝色水平二级导航菜单效果代码
2015/09/11 Javascript
谈谈JSON对象和字符串之间的相互转换JSON.stringify(obj)和JSON.parse(string)
2015/10/01 Javascript
15位和18位身份证JS校验的简单实例
2016/07/18 Javascript
详解Vue项目中出现Loading chunk {n} failed问题的解决方法
2018/09/14 Javascript
angularJs select绑定的model取不到值的解决方法
2018/10/08 Javascript
自定义Vue中的v-module双向绑定的实现
2019/04/17 Javascript
详解Node.js一行命令上传本地文件到服务器
2019/04/22 Javascript
React路由鉴权的实现方法
2019/09/05 Javascript
JS数组属性去重并校验重复数据
2020/01/10 Javascript
element-ui 实现响应式导航栏的示例代码
2020/05/08 Javascript
jQuery实现日历效果
2020/09/11 jQuery
JavaScript实现鼠标经过表格某行时此行变色
2020/11/20 Javascript
[16:27]DOTA2 HEROS教学视频教你分分钟做大人-艾欧
2014/06/11 DOTA
python中set()函数简介及实例解析
2018/01/09 Python
10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)
2018/10/11 Python
详解Python logging调用Logger.info方法的处理过程
2019/02/12 Python
python创造虚拟环境方法总结
2019/03/04 Python
python画图把时间作为横坐标的方法
2019/07/07 Python
学python安装的软件总结
2019/10/12 Python
pycharm 的Structure界面设置操作
2021/02/05 Python
意大利奢侈品购物网站:Deliberti
2019/10/08 全球购物
State Cashmere官网:半零售价可持续蒙古羊绒
2020/02/26 全球购物
优秀教师的感人事迹
2014/02/04 职场文书
学习决心书范文
2014/03/11 职场文书
表彰大会策划方案
2014/05/13 职场文书
节能环保口号
2014/06/12 职场文书
干部竞争上岗演讲稿
2014/09/11 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
HTML5基础学习之文本标签控制
2022/03/25 HTML / CSS