学习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+.htaccess实现全站静态HTML文件GZIP压缩传输(一)
Feb 15 PHP
PHP 图片水印类代码
Aug 27 PHP
PHP随机字符串生成代码(包括大小写字母)
Jun 24 PHP
PHP数据库链接类(PDO+Access)实例分享
Dec 05 PHP
ThinkPHP3.1的Widget新用法
Jun 19 PHP
PHP图片处理之使用imagecopyresampled函数实现图片缩放例子
Nov 19 PHP
PHP编程基本语法快速入门手册
Jan 07 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
Feb 27 PHP
Zend Studio使用技巧两则
Apr 01 PHP
php中Redis的应用--消息传递
Mar 28 PHP
PHP curl 或 file_get_contents 获取需要授权页面的方法
May 05 PHP
php源码的使用方法讲解
Sep 26 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从数组中随机选择若干不重复元素的方法
2015/03/14 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
PHP超级全局变量【$GLOBALS,$_SERVER,$_REQUEST等】用法实例分析
2019/12/11 PHP
passwordStrength 基于jquery的密码强度检测代码使用介绍
2011/10/08 Javascript
javascript之querySelector和querySelectorAll使用介绍
2011/12/20 Javascript
JS获取浏览器语言动态加载JS文件示例代码
2014/10/31 Javascript
jQuery Mobile动态刷新页面样式的实现方法
2016/05/28 Javascript
js注入 黑客之路必备!
2016/09/14 Javascript
js 模仿锚点定位的实现方法
2016/11/19 Javascript
JS实现简单短信验证码界面
2017/08/07 Javascript
详解基于 axios 的 Vue 项目 http 请求优化
2017/09/04 Javascript
AngularJS中下拉框的基本用法示例
2017/10/11 Javascript
JS实现的透明度渐变动画效果示例
2018/04/28 Javascript
5分钟快速掌握JS中var、let和const的异同
2018/09/19 Javascript
详解微信小程序缓存--缓存时效性
2019/05/02 Javascript
jQuery实现简易聊天框
2020/02/08 jQuery
Vue中keep-alive 实现后退不刷新并保持滚动位置
2020/03/17 Javascript
javascript用defineProperty实现简单的双向绑定方法
2020/04/03 Javascript
Python的Django框架中TEMPLATES项的设置教程
2015/05/29 Python
举例讲解Python的lambda语句声明匿名函数的用法
2016/07/01 Python
详解Python import方法引入模块的实例
2017/08/02 Python
Python使用Windows API创建窗口示例【基于win32gui模块】
2018/05/09 Python
pycharm执行python时,填写参数的方法
2018/10/29 Python
pycharm配置pyqt5-tools开发环境的方法步骤
2019/02/11 Python
python elasticsearch环境搭建详解
2019/09/02 Python
python:删除离群值操作(每一行为一类数据)
2020/06/08 Python
python实现双人五子棋(终端版)
2020/12/30 Python
python实现简单的井字棋游戏(gui界面)
2021/01/22 Python
汽车机修工岗位职责
2014/03/06 职场文书
中学校庆方案
2014/03/17 职场文书
大学生求职信范文
2014/05/24 职场文书
2014教师个人自我评价范文
2014/09/13 职场文书
2014年安全保卫工作总结
2014/11/13 职场文书
2016春季运动会通讯稿
2015/07/18 职场文书
放飞理想主题班会
2015/08/14 职场文书
PyTorch device与cuda.device用法
2022/04/03 Python