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 相关文章推荐
在WIN98下以apache模块方式安装php
Oct 09 PHP
php5 mysql分页实例代码
Apr 10 PHP
在PHP中使用模板的方法
May 24 PHP
PHP中全局变量global和$GLOBALS[]的区别分析
Aug 06 PHP
CodeIgniter图像处理类的深入解析
Jun 17 PHP
解析PHP中一些可能会被忽略的问题
Jun 21 PHP
PHP的Yii框架的基本使用示例
Aug 21 PHP
php实现在线通讯录功能(附源码)
May 13 PHP
php array_slice 取出数组中的一段序列实例
Nov 04 PHP
php Session无效分析资料整理
Nov 29 PHP
php实现的mysqldb读写分离操作类示例
Feb 07 PHP
使用PHPExcel导出Excel表
Sep 08 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
MySQL授权问题总结
2007/05/06 PHP
php数据结构与算法(PHP描述) 快速排序 quick sort
2012/06/21 PHP
Ajax和PHP正则表达式验证表单及验证码
2016/09/24 PHP
Laravel Eloquent ORM 多条件查询的例子
2019/10/10 PHP
JS 动态加载脚本的4种方法
2009/05/05 Javascript
一个cssQuery对象 javascript脚本实现代码
2009/07/21 Javascript
向当前style sheet中插入一个新的style实现方法
2013/04/01 Javascript
javascript封装的sqlite操作类实例
2015/07/17 Javascript
10个JavaScript中易犯小错误
2016/02/14 Javascript
Three.js利用dat.GUI如何简化试验流程详解
2017/09/26 Javascript
Vue代码整洁之去重方法整理
2019/08/06 Javascript
深入理解javascript中的this
2021/02/08 Javascript
[01:24]2014DOTA2 TI第二日 YYF表示这届谁赢都有可能
2014/07/11 DOTA
python正则匹配抓取豆瓣电影链接和评论代码分享
2013/12/27 Python
python基于Tkinter库实现简单文本编辑器实例
2015/05/05 Python
python爬虫_微信公众号推送信息爬取的实例
2017/10/23 Python
机器学习实战之knn算法pandas
2019/06/22 Python
Python基于机器学习方法实现的电影推荐系统实例详解
2019/06/25 Python
使用 tf.nn.dynamic_rnn 展开时间维度方式
2020/01/21 Python
已安装tensorflow-gpu,但keras无法使用GPU加速的解决
2020/02/07 Python
python thrift 实现 单端口多服务的过程
2020/06/08 Python
python实现文件+参数发送request的实例代码
2021/01/05 Python
python 逆向爬虫正确调用 JAR 加密逻辑
2021/01/12 Python
美国现代家具和家居商店:Apt2B
2016/08/29 全球购物
美国网上订购鲜花:FTD
2016/09/23 全球购物
白兰氏健康Mall:BRAND’S
2017/11/13 全球购物
Foot Locker加拿大官网:美国知名运动产品零售商
2019/07/21 全球购物
应届生自荐信范文
2014/02/21 职场文书
财务科科长岗位职责
2014/03/10 职场文书
品德评语大全
2014/05/05 职场文书
班主任寄语2015
2015/02/26 职场文书
2015毕业寄语大全
2015/02/26 职场文书
2015学生会文艺部工作总结
2015/04/03 职场文书
销售区域经理岗位职责
2015/04/10 职场文书
详解TS数字分隔符和更严格的类属性检查
2021/05/06 Javascript
Qt数据库应用之实现图片转pdf
2022/06/01 Java/Android