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 相关文章推荐
windows xp下安装pear
Dec 02 PHP
PHP注释实例技巧
Oct 03 PHP
php读取html并截取字符串的简单代码
Nov 30 PHP
使用VisualStudio开发php的图文设置方法
Aug 21 PHP
10个实用的PHP代码片段
Sep 02 PHP
PHP 下载文件时自动添加bom头的方法实例
Jan 10 PHP
php实现上传图片文件代码
Jul 19 PHP
讲解WordPress开发中一些常用的debug技巧
Dec 18 PHP
golang与PHP输出excel示例
Jul 22 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
Nov 03 PHP
PHP注释语法规范与命名规范详解篇
Jan 21 PHP
PHP微商城开源代码实例
Mar 27 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/10/09 PHP
DedeCMS dede_channeltype表字段注释
2010/04/07 PHP
php设计模式 Observer(观察者模式)
2011/06/26 PHP
使用PHP Socket写的POP3类
2013/10/30 PHP
php分页函数完整实例代码
2014/09/22 PHP
使用图灵api创建微信聊天机器人
2015/07/23 PHP
什么是PHP7中的孤儿进程与僵尸进程
2019/04/14 PHP
Jquery从头学起第四讲 jquery入门教程
2010/08/01 Javascript
JavaScript禁止页面操作的示例代码
2013/12/17 Javascript
基于jQuery实现动态数字展示效果
2015/08/12 Javascript
Jquery中使用show()与hide()方法动画显示和隐藏图片
2015/10/08 Javascript
深入浅出讲解ES6的解构
2016/08/03 Javascript
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
2016/10/08 Javascript
原生JS+CSS实现炫酷重力模拟弹跳系统的登录页面
2017/11/01 Javascript
vue click.stop阻止点击事件继续传播的方法
2018/09/04 Javascript
Angular使用cli生成自定义文件、组件的方法
2018/09/04 Javascript
vue webpack打包后图片路径错误的完美解决方法
2018/12/07 Javascript
vue打包npm run build时候界面报错的解决
2020/08/13 Javascript
[01:06] DOTA2英雄背景故事第三期之秩序法则光之守卫
2020/07/07 DOTA
Python文件操作,open读写文件,追加文本内容实例
2016/12/14 Python
python gdal安装与简单使用
2019/08/01 Python
python线程安全及多进程多线程实现方法详解
2019/09/27 Python
利用python在excel中画图的实现方法
2020/03/17 Python
python 已知平行四边形三个点,求第四个点的案例
2020/04/12 Python
如何理解Python中包的引入
2020/05/29 Python
python openpyxl模块的使用详解
2021/02/25 Python
Canvas图片分割效果的实现
2019/07/29 HTML / CSS
国际化的太阳镜及太阳镜配件零售商:Sunglass Hut
2016/07/26 全球购物
阿迪达斯新加坡官方网站:adidas新加坡
2019/12/06 全球购物
财务助理岗位职责
2013/11/10 职场文书
班级聚会策划书
2014/01/16 职场文书
《和我们一样享受春天》教学反思
2014/02/07 职场文书
小学生元旦广播稿
2014/02/21 职场文书
班主任个人工作反思
2014/04/28 职场文书
广告设计专业毕业生自我鉴定
2014/09/27 职场文书
合作协议书范本
2014/10/25 职场文书