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在XP下IIS和Apache2服务器上的安装
Sep 05 PHP
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
Sep 30 PHP
分页详解 从此分页无忧(PHP+mysql)
Nov 23 PHP
PHP令牌 Token改进版
Jul 18 PHP
解析php中memcache的应用
Jun 18 PHP
PHP APC缓存配置、使用详解
Mar 06 PHP
Laravel 5框架学习之Eloquent 关系
Apr 09 PHP
php自动更新版权信息显示的方法
Jun 19 PHP
PHP函数func_num_args用法实例分析
Dec 07 PHP
ucenter中词语过滤原理分析
Jul 13 PHP
php和asp语法上的区别总结
May 12 PHP
php使用gearman进行任务分发操作实例详解
Feb 26 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网页木马一枚 附PHP木马的防范方法
2009/10/09 PHP
php addslashes和mysql_real_escape_string
2010/01/24 PHP
php地址引用(php地址引用的效率问题)
2012/03/23 PHP
用来解析.htpasswd文件的PHP类
2012/09/05 PHP
使用纯php代码实现页面伪静态的方法
2015/07/25 PHP
PHP 等比例缩放图片详解及实例代码
2016/09/18 PHP
理解Javascript_07_理解instanceof实现原理
2010/10/15 Javascript
分享精心挑选的23款美轮美奂的jQuery 图片特效插件
2012/08/14 Javascript
js去除空格的12种实用方法
2013/11/08 Javascript
javascript 拷贝节点cloneNode()使用介绍
2014/04/03 Javascript
javascript if条件判断方法小结
2014/05/17 Javascript
在Python中使用glob模块查找文件路径的方法
2015/06/17 Javascript
BootStrap下拉菜单和滚动监听插件实现代码
2016/09/26 Javascript
表单input项使用label同时引用Bootstrap库导致input点击效果区增大问题
2016/10/11 Javascript
nodejs连接mysql数据库及基本知识点详解
2018/03/20 NodeJs
Vuex中的State使用介绍
2019/01/19 Javascript
[11:27]《一刀刀一天》之DOTA全时刻20:TI4总奖金突破920W TS赛事分析
2014/06/18 DOTA
Python2.x中str与unicode相关问题的解决方法
2015/03/30 Python
python处理csv数据动态显示曲线实例代码
2018/01/23 Python
pandas值替换方法
2018/07/10 Python
python中类的属性和方法介绍
2018/11/27 Python
Python 读取串口数据,动态绘图的示例
2019/07/02 Python
如何给Python代码进行加密
2020/01/10 Python
pytorch中 gpu与gpu、gpu与cpu 在load时相互转化操作
2020/05/25 Python
python 星号(*)的多种用途
2020/09/21 Python
python tkinter的消息框模块(messagebox,simpledialog)
2020/11/07 Python
canvas三角函数模拟水波效果的示例代码
2018/07/03 HTML / CSS
html5指南-7.geolocation结合google maps开发一个小的应用
2013/01/07 HTML / CSS
德国玩具商店:Planet Happy DE
2021/01/16 全球购物
幼儿园教师工作制度
2014/01/22 职场文书
给老婆的检讨书
2015/01/27 职场文书
致青春观后感
2015/06/09 职场文书
单位提档介绍信
2015/10/22 职场文书
导游词之黄帝陵景区
2019/09/16 职场文书
python如何读取.mtx文件
2021/04/22 Python