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实现框架(二)
Oct 09 PHP
PHP Smarty生成EXCEL文档的代码
Aug 23 PHP
PHP curl_setopt()函数实例代码与参数分析
Jun 02 PHP
ioncube_loader_win_5.2.dll的错误解决方法
Jan 04 PHP
php强制用户转向www域名的方法
Jun 19 PHP
简单介绍PHP的责任链编程模式
Aug 11 PHP
[原创]PHP正则匹配中英文、数字及下划线的方法【用户名验证】
Aug 01 PHP
PHP simplexml_import_dom()函数讲解
Feb 03 PHP
PHP安装memcache扩展的步骤讲解
Feb 14 PHP
PHP文件类型检查及fileinfo模块安装使用详解
May 09 PHP
Laravel 解决composer相关操作提示php相关异常的问题
Oct 23 PHP
分享8个Laravel模型时间戳使用技巧小结
Feb 12 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
漂亮的thinkphp 跳转页封装示例
2019/10/16 PHP
可以文本显示的公告栏的js代码
2007/03/11 Javascript
分享一个asp.net pager分页控件
2012/01/04 Javascript
JS onmousemove鼠标移动坐标接龙DIV效果实例
2013/12/16 Javascript
js 剪切板应用clipboardData详细解析
2013/12/17 Javascript
IE6已终止操作问题的2种情况及解决
2014/04/23 Javascript
SuperSlide2实现图片滚动特效
2014/06/20 Javascript
分析了一下JQuery中的extend方法实现原理
2015/02/27 Javascript
jQuery实现左右切换焦点图
2015/04/03 Javascript
jquery mobile 移动web(5)
2015/12/20 Javascript
JS批量替换内容中关键词为超链接
2017/02/20 Javascript
详解angular ui-grid之过滤器设置
2017/06/07 Javascript
vuex 使用文档小结篇
2018/01/11 Javascript
详解Webpack loader 之 file-loader
2018/11/07 Javascript
如何从零开始手写Koa2框架
2019/03/22 Javascript
小程序云开发之用户注册登录
2019/05/18 Javascript
手把手教您实现react异步加载高阶组件
2020/04/07 Javascript
[03:11]DOTA2上海特锦赛小组赛第一日recap精彩回顾
2016/02/28 DOTA
使用python装饰器验证配置文件示例
2014/02/24 Python
Python设计模式中单例模式的实现及在Tornado中的应用
2016/03/02 Python
django rest framework之请求与响应(详解)
2017/11/06 Python
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
2018/01/07 Python
Python3数据库操作包pymysql的操作方法
2018/07/16 Python
Python使用random.shuffle()打乱列表顺序的方法
2018/11/08 Python
python opencv 图像拼接的实现方法
2019/06/27 Python
5 分钟读懂Python 中的 Hook 钩子函数
2020/12/09 Python
浅析canvas元素的html尺寸和css尺寸对元素视觉的影响
2019/07/22 HTML / CSS
构造方法和其他方法的区别?怎么调用父类的构造方法
2013/09/22 面试题
写给女朋友的检讨书
2014/01/28 职场文书
贯彻学习两会心得体会范文
2014/03/17 职场文书
酒店管理失职检讨书
2014/09/16 职场文书
会计岗位职责
2015/02/03 职场文书
2015幼儿园新学期寄语
2015/02/27 职场文书
离婚被告代理词
2015/05/23 职场文书
学雷锋活动简报
2015/07/20 职场文书
纪律委员竞选稿
2015/11/19 职场文书