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-accelerator网站加速PHP缓冲的方法
Jul 30 PHP
PHP合并数组+与array_merge的区别分析
Aug 01 PHP
PHP5 的对象赋值机制介绍
Aug 02 PHP
解析curl提交GET,POST,Cookie的简单方法
Jun 29 PHP
php中sprintf与printf函数用法区别解析
Feb 17 PHP
PHP 验证登陆类分享
Mar 13 PHP
mysql_connect localhost和127.0.0.1的区别(网络层阐述)
Mar 26 PHP
PHP MPDF中文乱码的解决方式
Dec 08 PHP
php实现倒计时效果
Dec 19 PHP
Yii基于数组和对象的Model查询技巧实例详解
Dec 28 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
Jun 09 PHP
PHP简单实现记录网站访问量功能示例
Jun 06 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中文编码小技巧
2014/12/25 PHP
php实现简单文件下载的方法
2015/01/30 PHP
php实现的redis缓存类定义与使用方法示例
2017/08/09 PHP
laravel框架数据库配置及操作数据库示例
2019/10/10 PHP
jQuery数组处理方法汇总
2011/06/20 Javascript
jquery自定义类似$.ajax()的方法实现代码
2013/08/13 Javascript
JS控制图片等比例缩放的示例代码
2013/12/24 Javascript
innerHTML动态添加html代码和脚本兼容多个浏览器
2014/10/11 Javascript
Angular中的Promise对象($q介绍)
2015/03/03 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
2015/07/17 Javascript
JavaScript、jQuery与Ajax的关系
2016/01/24 Javascript
javascript中arguments,callee,caller详解
2016/03/16 Javascript
JavaScript中闭包的写法和作用详解
2016/06/29 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串、list集合
2016/08/11 Javascript
DWR3 访问WEB元素的两种方法实例详解
2017/01/03 Javascript
jQuery实现弹窗居中效果类似alert()
2017/02/27 Javascript
Vuex之理解Store的用法
2017/04/19 Javascript
vue.js实现价格格式化的方法
2017/05/23 Javascript
2种在vue项目中使用百度地图的简单方法
2018/09/28 Javascript
JavaScript"模拟事件"的注意要点详解
2019/02/13 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
[03:06]3分钟带你回顾DOTA2完美盛典&完美大师赛
2017/12/06 DOTA
python中xrange和range的区别
2014/05/13 Python
Python 通配符删除文件的实例
2018/04/24 Python
python 通过SSHTunnelForwarder隧道连接redis的方法
2019/02/19 Python
500行代码使用python写个微信小游戏飞机大战游戏
2019/10/16 Python
wxPython色环电阻计算器
2019/11/18 Python
tensorflow 环境变量设置方式
2020/02/06 Python
python如何判断IP地址合法性
2020/04/05 Python
20行Python代码实现一款永久免费PDF编辑工具的实现
2020/08/27 Python
python在CMD界面读取excel所有数据的示例
2020/09/28 Python
财政专业求职信范文
2014/02/19 职场文书
八项规定整改方案
2014/10/01 职场文书
2014年党的群众路线整改措施思想汇报
2014/10/12 职场文书
用Python实现一个打字速度测试工具来测试你的手速
2021/05/28 Python
kubernetes集群搭建Zabbix监控平台的详细过程
2022/07/07 Servers