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 相关文章推荐
php动态生成JavaScript代码
Mar 09 PHP
php设计模式 Command(命令模式)
Jun 26 PHP
解析PHP汉字转换拼音的类
Jun 18 PHP
两级联动select刷新后其值保持不变的实现方法
Jan 27 PHP
PHP获取数组最后一个值的2种方法
Jan 21 PHP
PHP批量生成图片缩略图的方法
Jun 18 PHP
9个比较实用的php代码片段
Mar 15 PHP
PHP CodeIgniter分页实例及多条件查询解决方案(推荐)
May 20 PHP
php简单读取.vcf格式文件的方法示例
Sep 02 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
Sep 22 PHP
PHP给源代码加密的几种方法汇总(推荐)
Feb 06 PHP
php定期拉取数据对比方法实例
Sep 22 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
在同一窗体中使用PHP来处理多个提交任务
2006/10/09 PHP
分页详解 从此分页无忧(PHP+mysql)
2007/11/23 PHP
PHPMailer的主要功能特点和简单使用说明
2014/02/17 PHP
Zend Framework教程之资源(Resources)用法实例详解
2016/03/14 PHP
PHP大文件切割上传并带进度条功能示例
2019/07/01 PHP
在Laravel中实现使用AJAX动态刷新部分页面
2019/10/15 PHP
Mootools 1.2教程 滚动条(Slider)
2009/09/15 Javascript
javascript showModalDialog模态对话框使用说明
2009/12/31 Javascript
关于火狐(firefox)及ie下event获取的两种方法
2012/12/27 Javascript
Google (Local) Search API的简单使用介绍
2013/11/28 Javascript
随鼠标上下滚动的jquery代码
2013/12/05 Javascript
jQuery如何实现点击页面获得当前点击元素的id或其他信息
2014/01/09 Javascript
二叉树的非递归后序遍历算法实例详解
2014/02/07 Javascript
JS实现的一个简单的Autocomplete自动完成例子
2014/04/16 Javascript
javascript日期格式化方法汇总
2015/10/04 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
2017/04/21 Javascript
jQuery tip提示插件(实例分享)
2017/04/28 jQuery
基于Jquery Ajax type的4种类型(详解)
2017/08/02 jQuery
Webpack优化配置缩小文件搜索范围
2017/12/25 Javascript
基于jquery的on和click的区别详解
2018/01/15 jQuery
浅谈layer弹出层按钮颜色修改方法
2019/09/11 Javascript
JS中多层次排序算法的实现代码
2021/01/06 Javascript
Python的爬虫框架scrapy用21行代码写一个爬虫
2017/04/24 Python
Python守护线程用法实例
2017/06/23 Python
python增加矩阵维度的实例讲解
2018/04/04 Python
matplotlib 输出保存指定尺寸的图片方法
2018/05/24 Python
Python中按键来获取指定的值
2019/03/02 Python
keras中的卷积层&amp;池化层的用法
2020/05/22 Python
暇步士官网:Hush Puppies
2016/09/22 全球购物
中专毕业生自我鉴定
2014/02/02 职场文书
个人整改方案范文
2014/10/25 职场文书
销售合作意向书范本
2015/05/08 职场文书
个人工作总结怎么写?
2019/04/09 职场文书
2019初中学生入团申请书
2019/06/27 职场文书
酒店工程部的岗位职责汇总大全
2019/10/23 职场文书
win11无法登录onedrive错误代码0x8004def7怎么办 ?
2022/04/05 数码科技