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安装问题
Oct 09 PHP
PHP编程网上资源导航
Oct 09 PHP
用PHP制作的意见反馈表源码
Mar 11 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
Jun 28 PHP
PHP 安全检测代码片段(分享)
Jul 05 PHP
CodeIgniter框架URL路由总结
Sep 03 PHP
PHP生成不重复标识符的方法
Nov 21 PHP
php使用GD创建保持宽高比缩略图的方法
Apr 17 PHP
PHP里面把16进制的图片数据显示在html的img标签上(实现方法)
May 02 PHP
thinkphp5框架实现数据库读取的数据转换成json格式示例
Oct 10 PHP
php中加密解密DES类的简单使用方法示例
Mar 26 PHP
PHP重载基础知识回顾
Sep 10 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
yii操作session实例简介
2014/07/31 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
php从数据库中获取数据用ajax传送到前台的方法
2018/08/20 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
jquery ajax 登录验证实现代码
2009/09/23 Javascript
Web 前端设计模式--Dom重构 提高显示性能
2010/10/22 Javascript
用JS控制回车事件的代码
2011/02/20 Javascript
ASP.NET MVC中EasyUI的datagrid跨域调用实现代码
2012/03/14 Javascript
js实现全屏漂浮广告移入光标停止移动
2013/12/02 Javascript
js处理php输出时间戳对不上号的解决方法
2014/06/20 Javascript
JavaScript中的对象与JSON
2015/07/03 Javascript
全面解析Bootstrap排版使用方法(标题)
2015/11/30 Javascript
jquery表单插件Autotab使用方法详解
2016/06/24 Javascript
利用Javascript仿Excel的数据透视分析功能
2016/09/07 Javascript
js获取html页面代码中图片地址的实现代码
2018/03/05 Javascript
Vue.js实现的购物车功能详解
2019/01/27 Javascript
VuePress 静态网站生成方法步骤
2019/02/14 Javascript
Angular 2使用路由自定义弹出组件toast操作示例
2019/05/10 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
2019/09/06 Javascript
Vue-drag-resize 拖拽缩放插件的使用(简单示例)
2019/12/04 Javascript
jQuery实现购物车全功能
2021/01/11 jQuery
python发送邮件接收邮件示例分享
2014/01/21 Python
Python出现segfault错误解决方法
2016/04/16 Python
python中requests小技巧
2017/05/10 Python
python 从csv读数据到mysql的实例
2018/06/21 Python
Python简单处理坐标排序问题示例
2019/07/11 Python
python 将视频 通过视频帧转换成时间实例
2020/04/23 Python
百丽国际旗下购物网站:优购
2017/02/28 全球购物
面包店的创业计划书范文
2014/01/16 职场文书
手术室护士长竞聘书
2014/03/31 职场文书
党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
召开会议通知范文
2015/04/15 职场文书
投标售后服务承诺书
2015/04/29 职场文书
2015重阳节敬老活动总结
2015/07/29 职场文书
Mysql中一千万条数据怎么快速查询
2021/12/06 MySQL
JavaScript流程控制(循环)
2021/12/06 Javascript