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 相关文章推荐
mysql+php分页类(已测)
Mar 31 PHP
php 动态添加记录
Mar 10 PHP
php 执行系统命令的方法
Jul 07 PHP
一个简洁的PHP可逆加密函数(分享)
Jun 06 PHP
ThinkPHP之getField详解
Jun 20 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
Jun 30 PHP
ThinkPHP中Session用法详解
Nov 29 PHP
PHP获取数组长度或某个值出现次数的方法
Feb 11 PHP
PHP+APACHE实现网址伪静态
Feb 22 PHP
php输出指定时间以前时间格式的方法
Mar 21 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
Jul 03 PHP
strpos() 函数判断字符串中是否包含某字符串的方法
Jan 16 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
codeigniter中测试通过的分页类示例
2014/04/17 PHP
php自定文件保存session的方法
2014/12/10 PHP
实例讲解PHP设计模式编程中的简单工厂模式
2016/02/29 PHP
前端开发必须知道的JS之原型和继承
2010/07/06 Javascript
jquery的Theme和Theme Switcher使用小结
2010/09/08 Javascript
javascript整除实现代码
2010/11/23 Javascript
JavaScript var声明变量背后的原理示例解析
2013/10/12 Javascript
js闭包的用途详解
2014/11/09 Javascript
JavaScript中Cookies的相关使用教程
2015/06/04 Javascript
JavaScript 七大技巧(二)
2015/12/13 Javascript
使用JQuery实现智能表单验证功能
2016/03/08 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(1)
2017/02/20 Javascript
React 高阶组件入门介绍
2018/01/11 Javascript
详解js加减乘除精确计算
2019/03/19 Javascript
ES6 Map结构的应用实例分析
2019/06/26 Javascript
JS数组方法reduce的用法实例分析
2020/03/03 Javascript
python远程登录代码
2008/04/29 Python
Python 命令行参数sys.argv
2008/09/06 Python
Python实现PS滤镜中马赛克效果示例
2018/01/20 Python
python在非root权限下的安装方法
2018/01/23 Python
python实现梯度下降算法
2020/03/24 Python
python写日志文件操作类与应用示例
2019/07/01 Python
使用python实现滑动验证码功能
2019/08/05 Python
python实现修改固定模式的字符串内容操作示例
2019/12/30 Python
css3实现背景动态渐变效果
2019/12/10 HTML / CSS
傲盾软件面试题
2015/08/17 面试题
酒店办公室文员岗位职责
2013/12/18 职场文书
乡镇办公室工作决心书
2014/03/11 职场文书
美术教师岗位职责
2014/03/18 职场文书
经贸专业毕业生求职信范文
2014/05/01 职场文书
女生节标语
2014/06/26 职场文书
2014党员干部四风问题对照检查材料思想汇报
2014/09/24 职场文书
失恋33天观后感
2015/06/11 职场文书
导游词之襄阳古城
2019/09/27 职场文书
浅谈JavaScript浅拷贝和深拷贝
2021/11/07 Javascript
nginx静态资源的服务器配置方法
2022/07/07 Servers