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用strstr()函数阻止垃圾评论(通过判断a标记)
Sep 28 PHP
zf框架的Filter过滤器使用示例
Mar 13 PHP
PHP解析目录路径的3个函数总结
Nov 18 PHP
PHP使用mysql_fetch_object从查询结果中获取对象集的方法
Mar 18 PHP
php实现粘贴截图并完成上传功能
May 17 PHP
浅谈PHP链表数据结构(单链表)
Jun 08 PHP
利用PHP生成CSV文件简单示例
Dec 21 PHP
PHP实现的简单在线计算器功能示例
Aug 02 PHP
PHP接口继承及接口多继承原理与实现方法详解
Oct 18 PHP
浅析PHP中的闭包和匿名函数
Dec 25 PHP
基于Laravel 5.2 regex验证的正确写法
Sep 29 PHP
在 Laravel 6 中缓存数据库查询结果的方法
Dec 11 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全功能无变形图片裁剪操作类与用法示例
2017/01/10 PHP
实现laravel 插入操作日志到数据库的方法
2019/10/11 PHP
Nigma vs Alliance BO5 第一场2.14
2021/03/10 DOTA
基于jquery的不规则矩形的排列实现代码
2012/04/16 Javascript
EXTjs4.0的store的findRecord的BUG演示代码
2013/06/08 Javascript
javascript自然分类法算法实现代码
2013/10/11 Javascript
jQuery根据表单name获取值的方法
2016/05/24 Javascript
js中获取时间new Date()的全面介绍
2016/06/20 Javascript
jQuery替换节点用法示例(使用replaceWith方法)
2016/09/08 Javascript
JavaScript计算值然后把值嵌入到html中的实现方法
2016/10/29 Javascript
JavaScript实现左右下拉框动态增删示例
2017/03/09 Javascript
jQuery实现拖动效果的实例代码
2017/06/25 jQuery
AngularJs+Bootstrap实现漂亮的计算器
2017/08/10 Javascript
jQuery实现注册会员时密码强度提示信息功能示例
2017/09/05 jQuery
Windows上node.js的多版本管理工具用法实例分析
2019/11/06 Javascript
[02:51]2014DOTA2 TI小组赛总结中国军团全部进军钥匙球馆
2014/07/15 DOTA
Python实现数据库并行读取和写入实例
2017/06/09 Python
Python with语句上下文管理器两种实现方法分析
2018/02/09 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
2018/02/11 Python
pandas 中对特征进行硬编码和onehot编码的实现
2019/12/20 Python
Python各种扩展名区别点整理
2020/02/27 Python
Python数据正态性检验实现过程
2020/04/18 Python
Python定时任务APScheduler原理及实例解析
2020/05/30 Python
python实现文件分片上传的接口自动化
2020/11/19 Python
Python与C/C++的相互调用案例
2021/03/04 Python
埃弗顿足球俱乐部官方网上商店:Everton Direct
2018/01/13 全球购物
物理系毕业生自荐信
2013/11/01 职场文书
中专生毕业自我鉴定
2013/11/01 职场文书
最新自我评价范文
2013/11/16 职场文书
英文自荐信
2013/12/19 职场文书
项目负责人任命书
2014/06/04 职场文书
婚前保证书范文
2015/02/28 职场文书
酒店员工辞职信范文
2015/02/28 职场文书
《作风建设永远在路上》心得体会
2016/01/21 职场文书
MySQL系列之十四 MySQL的高可用实现
2021/07/02 MySQL
使用Redis实现点赞取消点赞的详细代码
2022/03/20 Redis