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 include的妙用,实现路径加密
Jul 29 PHP
用mysql内存表来代替php session的类
Feb 01 PHP
php中用foreach来操作数组的代码
Jul 17 PHP
PHP Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
Jun 17 PHP
php动态生成缩略图并输出显示的方法
Apr 20 PHP
[原创]php实现 data url的图片生成与保存
Dec 04 PHP
探究Laravel使用env函数读取环境变量为null的问题
Dec 06 PHP
phpcms的分类名称和类别名称的调用
Jan 05 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
Jul 22 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
Aug 17 PHP
PHP架构及原理知识点详解
Dec 22 PHP
PHP代码覆盖率统计详解
Jul 22 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获取本周,上周,本月,上月,本季度日期的代码
2009/08/05 PHP
在windows服务器开启php的gd库phpinfo中未发现
2013/01/13 PHP
Yii2 输出xml格式数据的方法
2016/05/03 PHP
使用Codeigniter重写insert的方法(推荐)
2017/03/23 PHP
thinkPHP框架乐观锁和悲观锁实例分析
2019/10/30 PHP
BOOM vs RR BO5 第二场 2.14
2021/03/10 DOTA
JS对外部文件的加载及对IFRMAME的加载的实现,当加载完成后,指定指向方法(方法回调)
2011/07/04 Javascript
jQuery实现文本框邮箱输入自动补全效果
2015/11/17 Javascript
JavaScript实现阿拉伯数字和中文数字互相转换
2016/06/12 Javascript
AngularJS HTML DOM详解及示例代码
2016/08/17 Javascript
angularJS之$http:与服务器交互示例
2017/03/17 Javascript
微信小程序 地图map实例详解
2017/06/07 Javascript
IntelliJ IDEA 安装vue开发插件的方法
2017/11/21 Javascript
JS设计模式之状态模式概念与用法分析
2018/02/05 Javascript
vuejs 制作背景淡入淡出切换动画的实例
2018/09/01 Javascript
JS事件流与事件处理程序实例分析
2019/08/16 Javascript
jquery实现商品sku多属性选择功能(商品详情页)
2019/12/20 jQuery
Vue开发中遇到的跨域问题及解决方法
2020/02/11 Javascript
[01:03:50]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第二场 2月7日
2021/03/11 DOTA
详解Python的Django框架中inclusion_tag的使用
2015/07/21 Python
python 链接和操作 memcache方法
2017/03/04 Python
详解Python self 参数
2019/08/30 Python
Python测试线程应用程序过程解析
2019/12/31 Python
python实现在线翻译功能
2020/03/03 Python
业务总经理岗位职责
2014/02/03 职场文书
《小小竹排画中游》教学反思
2014/02/26 职场文书
职业生涯规划书结束语
2014/04/15 职场文书
仓库规划计划书
2014/04/28 职场文书
党员教师一句话承诺
2014/05/30 职场文书
安全标语大全
2014/06/10 职场文书
班组长安全工作职责
2014/07/15 职场文书
内科护士节演讲稿
2014/09/11 职场文书
公司收款委托书范本
2014/09/20 职场文书
2014新生大学四年计划书
2014/09/21 职场文书
论文答谢词
2015/01/20 职场文书
六年级上册《闻官军收河南河北》的教学设计
2019/11/15 职场文书