PHP设计模式之装饰器模式实例详解


Posted in PHP onFebruary 07, 2018

本文实例讲述了PHP设计模式之装饰器模式。分享给大家供大家参考,具体如下:

装饰器模式又叫装饰者模式。装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

UML类图:

PHP设计模式之装饰器模式实例详解

角色:

组件对象的接口:可以给这些对象动态的添加职责
所有装饰器的父类:需要定义一个与组件接口一致的接口,并持有一个Component对象,该对象其实就是被装饰的对象。
具体的装饰器类:实现具体要向被装饰对象添加的功能。用来装饰具体的组件对象或者另外一个具体的装饰器对象。

具体代码:

<?php
/**
 * Created by PhpStorm.
 * User: Jiang
 * Date: 2015/5/3
 * Time: 11:11
 */
/**组件对象接口
 * Interface IComponent
 */
interface IComponent
{
  function Display();
}
/**待装饰对象
 * Class Person
 */
class Person implements IComponent
{
  private $name;
  function __construct($name)
  {
    $this->name=$name;
  }
  function Display()
  {
    echo "装扮的:{$this->name}<br/>";
  }
}
/**所有装饰器父类
 * Class Clothes
 */
class Clothes implements IComponent
{
  protected $component;
  function Decorate(IComponent $component)
  {
    $this->component=$component;
  }
  function Display()
  {
    if(!empty($this->component))
    {
      $this->component->Display();
    }
  }
}
//------------------------------具体装饰器----------------
class PiXie extends Clothes
{
  function Display()
  {
    echo "皮鞋 ";
    parent::Display();
  }
}
class QiuXie extends Clothes
{
  function Display()
  {
    echo "球鞋 ";
    parent::Display();
  }
}
class Tshirt extends Clothes
{
  function Display()
  {
    echo "T恤 ";
    parent::Display();
  }
}
class Waitao extends Clothes
{
  function Display()
  {
    echo "外套 ";
    parent::Display();
  }
}

调用客户端测试代码:

header("Content-Type:text/html;charset=utf-8");
//------------------------装饰器模式测试代码------------------
require_once "./Decorator/Decorator.php";
$Yaoming=new Person("姚明");
$aTai=new Person("A泰斯特");
$pixie=new PiXie();
$waitao=new Waitao();
$pixie->Decorate($Yaoming);
$waitao->Decorate($pixie);
$waitao->Display();
echo "<hr/>";
$qiuxie=new QiuXie();
$tshirt=new Tshirt();
$qiuxie->Decorate($aTai);
$tshirt->Decorate($qiuxie);
$tshirt->Display();

适用场景:

1. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。

2. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。

3. 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
详细介绍:Apache+PHP+MySQL配置攻略
Sep 05 PHP
php5编程中的异常处理详细方法介绍
Jul 29 PHP
学习php中的正则表达式
Aug 17 PHP
浅谈PHP正则表达式中修饰符/i, /is, /s, /isU
Oct 21 PHP
WampServer下安装多个版本的PHP、mysql、apache图文教程
Jan 07 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
Jun 10 PHP
PHP中Session可能会引起并发问题
Jun 26 PHP
android上传图片到PHP的过程详解
Aug 03 PHP
详解PHP执行定时任务的实现思路
Dec 21 PHP
php图形jpgraph操作实例分析
Feb 22 PHP
解决安装WampServer时提示缺少msvcr110.dll文件的问题
Jul 09 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
Sep 17 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
Feb 07 #PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
Feb 07 #PHP
php删除一个路径下的所有文件夹和文件的方法
Feb 07 #PHP
浅析PHP类的反射来实现依赖注入过程
Feb 06 #PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
Feb 06 #PHP
PHP给源代码加密的几种方法汇总(推荐)
Feb 06 #PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
Feb 06 #PHP
You might like
利用discuz实现PHP大文件上传应用实例代码
2008/11/14 PHP
php上传文件的增强函数
2010/07/21 PHP
php计算整个mysql数据库大小的方法
2015/06/19 PHP
PHP下载文件函数与用法示例
2019/09/27 PHP
js post方式传递提交的实现代码
2010/05/31 Javascript
javascript 事件处理程序介绍
2012/06/27 Javascript
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
2012/12/27 Javascript
jquery通过a标签删除table中的一行的代码
2013/12/02 Javascript
jQuery实现的图文高亮滚动切换特效实例
2015/08/10 Javascript
jQuery实现div拖拽效果实例分析
2016/02/20 Javascript
基于jquery编写的放大镜插件
2016/03/23 Javascript
js Canvas实现的日历时钟案例分享
2016/12/25 Javascript
yii form 表单提交之前JS在提交按钮的验证方法
2017/03/15 Javascript
js实现小球在页面规定的区域运动
2020/06/16 Javascript
详解vue之自行实现派发与广播(dispatch与broadcast)
2021/01/19 Vue.js
[01:38:19]夜魇凡尔赛茶话会 第五期
2021/03/11 DOTA
Django自定义插件实现网站登录验证码功能
2017/04/19 Python
python 文件操作删除某行的实例
2017/09/04 Python
浅谈python多进程共享变量Value的使用tips
2019/07/16 Python
Python K最近邻从原理到实现的方法
2019/08/15 Python
关于pycharm中pip版本10.0无法使用的解决办法
2019/10/10 Python
使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)
2020/01/18 Python
python闭包与引用以及需要注意的陷阱
2020/09/18 Python
python 实现学生信息管理系统的示例
2020/11/28 Python
bonprix匈牙利:女士、男士和儿童服装
2019/07/19 全球购物
2019年分享net面试的经历和题目
2016/08/07 面试题
有模特经验的简历自我评价
2013/09/19 职场文书
2014年小班元旦活动方案
2014/02/16 职场文书
科长竞争上岗演讲稿
2014/05/12 职场文书
专题组织生活会方案
2014/06/15 职场文书
大专学生求职信
2014/07/04 职场文书
先进工作者申报材料
2014/12/23 职场文书
世界卫生日宣传活动总结
2015/02/09 职场文书
SQL Server基本使用和简单的CRUD操作
2021/04/05 SQL Server
CSS3实现的侧滑菜单
2021/04/27 HTML / CSS
sql中mod()函数取余数的用法
2021/05/29 SQL Server