PHP设计模式之装饰者模式代码实例


Posted in PHP onMay 11, 2015

定义:

装饰者模式就是不修改原类代码和继承的情况下动态扩展类的功能。传统的编程模式都是子类继承父类实现方法重载,使用装饰器模式,只需添加一个新的装饰器对象,更加灵活,避免类数量和层次过多。

角色:

Component(被装饰对象基类)
ConcreteComponent(具体被装饰对象)
Decorator(装饰者基类)
ContreteDecorator(具体的装饰者类)

示例代码:

//被装饰者基类
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();
  }
}
 
//具体装饰者类
class ConcreteComponent implements Component
{
  public function operation()
  {
    echo 'do operation'.PHP_EOL;
  }
}
 
//具体装饰类A
class ConcreteDecoratorA extends Decorator {
  public function __construct(Component $component) {
    parent::__construct($component);
 
  }
 
  public function operation() {
    parent::operation();
    $this->addedOperationA();  // 新增加的操作
  }
 
  public function addedOperationA() {
    echo 'Add Operation A '.PHP_EOL;
  }
}
 
//具体装饰类B
class ConcreteDecoratorB extends Decorator {
  public function __construct(Component $component) {
    parent::__construct($component);
 
  }
 
  public function operation() {
    parent::operation();
    $this->addedOperationB();
  }
 
  public function addedOperationB() {
    echo 'Add Operation B '.PHP_EOL;
  }
}
 
 
class Client {
 
  public static function main() {
    /*
    do operation
    Add Operation A
    */
    $decoratorA = new ConcreteDecoratorA(new ConcreteComponent());
    $decoratorA->operation();
 
 
    /*
    do operation
    Add Operation A 
    Add Operation B 
    */
    $decoratorB = new ConcreteDecoratorB($decoratorA);
    $decoratorB->operation();
  }
 
}
 
Client::main();
PHP 相关文章推荐
php过滤危险html代码
Aug 18 PHP
PHP 读取文件的正确方法
Apr 29 PHP
php5 apache 2.2 webservice 创建与配置(java)
Jan 27 PHP
比较简单的百度网盘文件直链PHP代码
Mar 24 PHP
php 无法加载mcrypt.dll的解决办法
Apr 03 PHP
PHP zip扩展Linux下安装过程分享
May 05 PHP
ThinkPHP模板自定义标签使用方法
Jun 26 PHP
字符串长度函数strlen和mb_strlen的区别示例介绍
Sep 09 PHP
一个比较不错的PHP日历类分享
Nov 18 PHP
php使用标签替换的方式生成静态页面
May 21 PHP
php使用正则表达式去掉html中的注释方法
Nov 03 PHP
Laravel接收前端ajax传来的数据的实例代码
Jul 20 PHP
PHP超牛逼无限极分类生成树方法
May 11 #PHP
php以fastCGI的方式运行时文件系统权限问题及解决方法
May 11 #PHP
PHP获取当前日期和时间及格式化方法参数
May 11 #PHP
PHP借助phpmailer发送邮件
May 11 #PHP
PHP date函数常用时间处理方法
May 11 #PHP
护卫神php套件 php版本升级方法(php5.5.24)
May 10 #PHP
php.ini中的request_order推荐设置
May 10 #PHP
You might like
PHP 一个随机字符串生成代码
2010/05/26 PHP
解析将多维数组转换为支持curl提交的一维数组格式
2013/07/08 PHP
destoon各类调用汇总
2014/06/20 PHP
php 如何禁用eval() 函数实例详解
2016/12/01 PHP
使弱类型的语言JavaScript变强势
2009/06/22 Javascript
将查询条件的input、select清空
2014/01/14 Javascript
通过复制Table生成word和excel的javascript代码
2014/01/20 Javascript
JQuery的$和其它JS发生冲突的快速解决方法
2014/01/24 Javascript
JavaScript-RegExp对象只能使用一次问题解决方法
2014/06/23 Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
2017/03/31 Javascript
jQuery插件FusionCharts绘制的3D双柱状图效果示例【附demo源码】
2017/04/20 jQuery
js学习总结之dom2级事件基础知识详解
2017/07/27 Javascript
详解ES6通过WeakMap解决内存泄漏问题
2018/03/09 Javascript
JS回调函数简单易懂的入门实例分析
2019/09/29 Javascript
微信内置浏览器图片查看器的代码实例
2019/10/08 Javascript
es6函数之rest参数用法实例分析
2020/04/18 Javascript
Element Popover 弹出框的使用示例
2020/07/26 Javascript
Nuxt 项目性能优化调研分析
2020/11/07 Javascript
[06:24]DOTA2 2015国际邀请赛中国区预选赛第二日TOP10
2015/05/27 DOTA
详解python读取和输出到txt
2019/03/29 Python
python之生产者消费者模型实现详解
2019/07/27 Python
python opencv如何实现图片绘制
2020/01/19 Python
利用python中集合的唯一性实现去重
2020/02/11 Python
python math模块的基本使用教程
2021/01/16 Python
Tripadvisor新西兰:阅读评论,比较价格和酒店预订
2018/02/10 全球购物
ANINE BING官方网站:奢华的衣橱基本款和时尚永恒的单品
2019/11/26 全球购物
介绍下java.util.Arrays类
2012/10/16 面试题
HttpServlet类中的主要方法都有哪些?各自的作用是什么?
2014/03/16 面试题
竞聘副主任科员演讲稿
2014/01/11 职场文书
团日活动总结模板
2014/06/25 职场文书
医生爱岗敬业演讲稿
2014/08/26 职场文书
公司委托书格式范本
2014/09/16 职场文书
体育部部长竞选稿
2015/11/21 职场文书
用Python实现Newton插值法
2021/04/17 Python
总结Python使用过程中的bug
2021/06/18 Python
ElementUI实现el-form表单重置功能按钮
2021/07/21 Javascript