学习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 discuz 主题表和回帖表的设计
Mar 13 PHP
smarty模板嵌套之include与fetch性能测试
Dec 05 PHP
php获取qq用户昵称和在线状态(实例分析)
Oct 27 PHP
PHP弹出提示框并跳转到新页面即重定向到新页面
Jan 24 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
Dec 19 PHP
PHP获得数组交集与差集的方法
Jun 10 PHP
一个PHP实现的轻量级简单爬虫
Jul 08 PHP
yii2控制器Controller Ajax操作示例
Jul 23 PHP
Centos 6.5下PHP 5.3安装ffmpeg扩展的步骤详解
Mar 02 PHP
PHP守护进程化在C和PHP环境下的实现
Nov 21 PHP
PHP大文件切割上传功能实例分析
Jul 01 PHP
Thinkphp 框架扩展之应用模式实现方法分析
Apr 27 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实现将任意进制数转换成10进制的方法
2015/04/17 PHP
PHP小偷程序的设计与实现方法详解
2016/10/15 PHP
Symfony查询方法实例小结
2017/06/28 PHP
一个JS翻页效果
2007/07/23 Javascript
js每次Title显示不同的名言
2008/09/25 Javascript
javascript来定义类的规范小结
2010/11/19 Javascript
JS对select控件option选项的增删改查示例代码
2013/10/21 Javascript
JavaScript中双叹号(!!)作用示例介绍
2014/04/10 Javascript
JS显示表格内指定行html代码的方法
2015/03/31 Javascript
jquery+css3实现网页背景花瓣随机飘落特效
2015/08/17 Javascript
JavaScript实现复制内容到粘贴板代码
2016/03/31 Javascript
JS限制条件补全问题实例分析
2016/12/16 Javascript
微信小程序 Button 组件详解及简单实例
2017/01/10 Javascript
Vue监听数据对象变化源码
2017/03/09 Javascript
微信小程序实现下拉刷新和轮播图效果
2017/11/21 Javascript
javascript闭包的使用之按钮切换功能
2018/08/30 Javascript
vue项目使用axios发送请求让ajax请求头部携带cookie的方法
2018/09/26 Javascript
Node爬取大批量文件的方法示例
2019/06/28 Javascript
vue项目中使用particles实现粒子背景效果及遇到的坑(按钮没有点击响应)
2020/02/11 Javascript
[01:02]DOTA2辉夜杯决赛日 CDEC.Y对阵VG赛前花絮
2015/12/27 DOTA
Python 调用DLL操作抄表机
2009/01/12 Python
详解Python nose单元测试框架的安装与使用
2017/12/20 Python
python实现扫描日志关键字的示例
2018/04/28 Python
python 自定义异常和异常捕捉的方法
2018/10/18 Python
python爬虫获取百度首页内容教学
2018/12/23 Python
Django集成搜索引擎Elasticserach的方法示例
2019/06/04 Python
python tkinter控件布局项目实例
2019/11/04 Python
keras自定义回调函数查看训练的loss和accuracy方式
2020/05/23 Python
HTML5 canvas 基本语法
2009/08/26 HTML / CSS
三年级学生评语
2014/04/23 职场文书
股东出资证明书(正规版)
2014/09/24 职场文书
民用住房租房协议书
2014/10/29 职场文书
获奖感言范文
2015/07/31 职场文书
同事欢送会致辞
2015/07/31 职场文书
教师远程培训心得体会
2016/01/09 职场文书
pytorch锁死在dataloader(训练时卡死)
2021/05/28 Python