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和ACCESS写聊天室(一)
Oct 09 PHP
PHP集成FCK的函数代码
Sep 27 PHP
php header示例代码(推荐)
Sep 08 PHP
PHP ? EasyUI DataGrid 资料存的方式介绍
Nov 07 PHP
计算php页面运行时间的函数介绍
Jul 01 PHP
php中json_encode UTF-8中文乱码的更好解决方法
Sep 28 PHP
PHP生成随机数的方法总结
Mar 01 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
Aug 02 PHP
CodeIgniter框架钩子机制实现方法【hooks类】
Aug 21 PHP
php时间戳转换代码详解
Aug 04 PHP
php7 图形用户界面GUI 开发示例
Feb 22 PHP
PHP http请求超时问题解决方案
Nov 13 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
linux下实现定时执行php脚本
2015/02/13 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
2016/01/05 PHP
Zend Framework入门教程之Zend_Session会话操作详解
2016/12/08 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
不安全的常用的js写法
2009/09/15 Javascript
最简单的js图片切换效果实现代码
2011/09/24 Javascript
JavaScript?Apple设备检测示例代码
2013/11/15 Javascript
我的Node.js学习之路(一)
2014/07/06 Javascript
javascript 构造函数方式定义对象
2015/01/02 Javascript
js生成随机数的过程解析
2015/11/24 Javascript
原生JavaScript实现瀑布流布局
2020/06/28 Javascript
JavaScript引用类型和基本类型详解
2016/01/06 Javascript
Avalon中文长字符截取、关键字符隐藏、自定义过滤器
2016/05/18 Javascript
不同js异步函数同步的实现方法
2016/05/28 Javascript
BootStrap组件之进度条的基本用法
2017/01/19 Javascript
jQuery 添加样式属性的优先级别方法(推荐)
2017/06/08 jQuery
详解Vue基于vue-quill-editor富文本编辑器使用心得
2019/01/03 Javascript
Vue.js项目实战之多语种网站的功能实现(租车)
2019/08/07 Javascript
JS/CSS实现字符串单词首字母大写功能
2019/09/03 Javascript
React学习之JSX与react事件实例分析
2020/01/06 Javascript
js实现盒子滚动动画效果
2020/08/09 Javascript
wxpython 最小化到托盘与欢迎图片的实现方法
2014/06/09 Python
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
Python字符串的全排列算法实例详解
2019/01/07 Python
Python中使用threading.Event协调线程的运行详解
2020/05/02 Python
python3中布局背景颜色代码分析
2020/12/01 Python
html5手机端页面可以向右滑动导致样式受影响的问题
2018/06/20 HTML / CSS
采购部部长岗位职责
2014/02/06 职场文书
《临死前的严监生》教学反思
2014/02/13 职场文书
喝酒检查书范文
2014/02/23 职场文书
2014年9.18纪念日演讲稿
2014/09/14 职场文书
公司优秀员工推荐信
2015/03/24 职场文书
校园环境卫生倡议书
2015/04/29 职场文书
Python3 类型标注支持操作
2021/06/02 Python
Python图像处理库PIL详细使用说明
2022/04/06 Python