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中防止SQL注入实现代码
Feb 19 PHP
自定义php类(查找/修改)xml文档
Mar 26 PHP
sae使用smarty模板的方法
Dec 17 PHP
PHP实现从远程下载文件的方法
Mar 12 PHP
PHP中的静态变量及static静态变量使用详解
Nov 05 PHP
php实现微信发红包
Dec 05 PHP
深入解析PHP的Yii框架中的缓存功能
Mar 29 PHP
Yii2 rbac权限控制之菜单menu实例教程
Apr 28 PHP
php版微信开发Token验证失败或请求URL超时问题的解决方法
Sep 23 PHP
PHP处理bmp格式图片的方法分析
Jul 04 PHP
thinkphp5引入公共部分header、footer的方法详解
Sep 14 PHP
Laravel5.4框架使用socialite实现github登录的方法
Mar 20 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
福利彩票幸运号码自动生成器
2006/10/09 PHP
CI框架给视图添加动态数据
2014/12/01 PHP
PHP文件下载实例代码浅析
2016/08/17 PHP
PHP实现文件上传功能实例代码
2017/05/18 PHP
Javascript图像处理—为矩阵添加常用方法
2012/12/27 Javascript
javascript函数作用域学习示例(js作用域)
2014/01/13 Javascript
21个JavaScript事件(Events)属性汇总
2014/12/02 Javascript
创建你的第一个AngularJS应用的方法
2015/06/16 Javascript
onclick和onblur冲突问题的快速解决方法
2016/04/28 Javascript
微信小程序 条件渲染详解
2016/10/09 Javascript
bootstrap中使用google prettify让代码高亮的方法
2016/10/21 Javascript
javascript编程实现栈的方法详解【经典数据结构】
2017/04/11 Javascript
vue axios用法教程详解
2017/07/23 Javascript
初探JavaScript 面向对象(推荐)
2017/09/03 Javascript
搭建element-ui的Vue前端工程操作实例
2018/02/23 Javascript
Layui实现主窗口和Iframe层参数传递
2019/11/14 Javascript
Vue父组件向子组件传值以及data和props的区别详解
2020/03/02 Javascript
JavaScript实现瀑布流布局的3种方式
2020/12/27 Javascript
python进阶教程之模块(module)介绍
2014/08/30 Python
跟老齐学Python之编写类之一创建实例
2014/10/11 Python
python爬虫的工作原理
2017/03/05 Python
python登录并爬取淘宝信息代码示例
2017/12/09 Python
用Eclipse写python程序
2018/02/10 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
2019/06/11 Python
Python OpenCV 使用滑动条来调整函数参数的方法
2019/07/08 Python
简单了解python反射机制的一些知识
2019/07/13 Python
基于python实现FTP文件上传与下载操作(ftp&sftp协议)
2020/04/01 Python
Java里面如何把一个Array数组转换成Collection, List
2013/07/26 面试题
在网络中有两台主机A和B,并通过路由器和其他交换设备连接起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排
2014/01/13 面试题
英文版区域经理求职信
2013/10/23 职场文书
秘书专业自荐信范文
2013/12/26 职场文书
2014年会演讲稿范文
2014/01/06 职场文书
秋季运动会加油稿200字
2014/01/11 职场文书
2015年重阳节慰问信
2015/03/23 职场文书
写给女朋友的保证书
2015/05/09 职场文书
创业计划书介绍
2019/04/24 职场文书