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 相关文章推荐
在PHP3中实现SESSION的功能(一)
Oct 09 PHP
PHP配置心得包含MYSQL5乱码解决
Nov 20 PHP
php中定义网站根目录的常用方法
Aug 08 PHP
php 邮件发送问题解决
Mar 22 PHP
php实现的ping端口函数实例
Nov 12 PHP
PHP中COOKIES使用示例
Jul 26 PHP
ThinkPHP实现递归无级分类――代码少
Jul 29 PHP
非常全面的php日期时间运算汇总
Nov 04 PHP
PHP获取文件扩展名的4种方法
Nov 24 PHP
PHP实现的二分查找算法实例分析
Dec 19 PHP
php从数据库中获取数据用ajax传送到前台的方法
Aug 20 PHP
PHP写API输出的时用echo的原因详解
Apr 28 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中将数组转成XML格式的实现代码
2011/08/08 PHP
phpmyadmin3 安装配置图解教程
2012/03/29 PHP
Yii2中多表关联查询hasOne hasMany的方法
2017/02/15 PHP
Javascript实例教程(19) 使用HoTMetal(6)
2006/12/23 Javascript
张孝祥JavaScript学习阶段性总结(2)--(X)HTML学习
2007/02/03 Javascript
js去字符串前后空格5种实现方法及比较
2013/04/03 Javascript
JQuery选择器绑定事件及修改内容的方法
2015/01/23 Javascript
JQuery中Bind()事件用法分析
2015/05/05 Javascript
Node.js程序中的本地文件操作用法小结
2016/03/06 Javascript
jQuery实现鼠标滑过预览图片大图效果的方法
2017/04/26 jQuery
详解angularJS+Ionic移动端图片上传的解决办法
2017/09/13 Javascript
Angularjs cookie 操作实例详解
2017/09/27 Javascript
基于jquery的on和click的区别详解
2018/01/15 jQuery
Angular利用内容投射向组件输入ngForOf模板的方法
2018/03/05 Javascript
vue 移动端注入骨架屏的配置方法
2019/06/25 Javascript
详解elementui之el-image-viewer(图片查看器)
2019/08/30 Javascript
解决vue页面渲染但dom没渲染的操作
2020/07/27 Javascript
python多重继承实例
2014/10/11 Python
pandas数据处理基础之筛选指定行或者指定列的数据
2018/05/03 Python
使用python生成杨辉三角形的示例代码
2018/08/29 Python
Python3 读、写Excel文件的操作方法
2018/10/20 Python
Python代码中如何读取键盘录入的值
2020/05/27 Python
浅析Python 序列化与反序列化
2020/08/05 Python
超市营业员求职简历的自我评价
2013/10/17 职场文书
医药个人求职信范文
2014/01/29 职场文书
技校学生个人职业生涯规划范文
2014/03/03 职场文书
烹饪大赛策划方案
2014/05/26 职场文书
经理岗位职责
2015/02/02 职场文书
教师节主持词开场白
2015/05/29 职场文书
小学同学聚会感言
2015/07/30 职场文书
小学体育组工作总结
2015/08/13 职场文书
爱国之歌(8首)
2019/09/29 职场文书
MYSQL 无法识别中文的永久解决方法
2021/06/03 MySQL
科学家研发出新型速效酶,可在 24 小时内降解塑料制品
2022/04/29 数码科技
nginx代理实现静态资源访问的示例代码
2022/07/07 Servers
Win11 Dev 预览版25174.1000发布 (附更新修复内容汇总)
2022/08/05 数码科技