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 相关文章推荐
玩转虚拟域名◎+ .
Oct 09 PHP
php fckeditor 调用的函数
Jun 21 PHP
simplehtmldom Doc api帮助文档
Mar 26 PHP
PHP导出EXCEL快速开发指南--PHPEXCEL的使用详解
Jun 03 PHP
浅析SVN常见问题及解决方法
Jun 21 PHP
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
Jun 23 PHP
ThinkPHP中的三大自动简介
Aug 22 PHP
简单介绍win7下搭建apache+php+mysql开发环境
Aug 06 PHP
PHP版本常用的排序算法汇总
Dec 20 PHP
PHP全局变量与超级全局变量区别分析
Apr 01 PHP
LINUX下PHP程序实现WORD文件转化为PDF文件的方法
May 13 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
Jun 16 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分页函数
2006/07/08 PHP
PHP中上传大体积文件时需要的设置
2006/10/09 PHP
一个简易需要注册的留言版程序
2006/10/09 PHP
PHP常用代码
2006/11/23 PHP
php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
2013/06/18 PHP
浅析php中抽象类和接口的概念以及区别
2013/06/27 PHP
Zend Framework教程之视图组件Zend_View用法详解
2016/03/05 PHP
PHP面向对象程序设计__tostring()和__invoke()用法分析
2019/06/12 PHP
laravel-admin 实现在指定的相册下添加照片
2019/10/21 PHP
javascript编程起步(第二课)
2007/02/27 Javascript
js 图片等比例缩放代码
2010/05/13 Javascript
js动态拼接正则表达式的两种方法
2014/03/04 Javascript
js实现点击图片改变页面背景图的方法
2015/02/28 Javascript
JavaScript使用function定义对象并调用的方法
2015/03/23 Javascript
Jquery ajax基础教程
2015/11/20 Javascript
实例讲解jQuery中对事件的命名空间的运用
2016/05/24 Javascript
AngularJS基础 ng-disabled 指令详解及简单示例
2016/08/01 Javascript
网页挂马方式整理及详细介绍
2016/11/03 Javascript
JS自定义混合Mixin函数示例
2016/11/26 Javascript
Angularjs中使用layDate日期控件示例
2017/01/11 Javascript
bootstrap table 多选框分页保留示例代码
2017/03/08 Javascript
详解Vue单元测试case写法
2018/05/24 Javascript
js实现ATM机存取款功能
2020/10/27 Javascript
JS如何实现网站中PC端和手机端自动识别并跳转对应的代码
2020/01/08 Javascript
python打开windows应用程序的实例
2019/06/28 Python
tensorflow将图片保存为tfrecord和tfrecord的读取方式
2020/02/17 Python
执行Python程序时模块报错问题
2020/03/26 Python
HTML5页面中尝试调起APP功能
2017/09/12 HTML / CSS
如何处理简单的PHP错误
2015/10/14 面试题
社区党总支书记先进事迹材料
2014/01/24 职场文书
公职人员索取回扣检举信
2014/04/04 职场文书
大学生见习总结报告
2015/06/24 职场文书
将图片保存到mysql数据库并展示在前端页面的实现代码
2021/05/02 MySQL
mysql联合索引的使用规则
2021/06/23 MySQL
《巫师》是美食游戏?CDPR10月将推出《巫师》官方食谱
2022/04/03 其他游戏
nginx配置指令之server_name的具体使用
2022/08/14 Servers