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中HTTP方式下的Gzip压缩传输方法举偶
Feb 15 PHP
PHP实现MVC开发得最简单的方法――模型
Apr 10 PHP
解析在PHP中使用mysqli扩展库对mysql的操作
Jul 03 PHP
php调用c接口无错版介绍
Mar 11 PHP
php实现文件下载代码分享
Aug 19 PHP
PHP实现Soap通讯的方法
Nov 03 PHP
制作个性化的WordPress登陆界面的实例教程
May 21 PHP
PHP生成唯一ID之SnowFlake算法
Dec 17 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
Nov 25 PHP
php实现姓名根据首字母排序的类与方法(实例代码)
May 16 PHP
PHP连接MySQL数据库并以json格式输出
May 21 PHP
laravel dingo API返回自定义错误信息的实例
Sep 29 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提交过来的数据生成为txt文件
2016/04/28 PHP
php 开发中加密的几种方法总结
2017/03/22 PHP
JSDoc 介绍使用规范JsDoc的使用介绍
2011/02/12 Javascript
jquery的冒泡事件的阻止与允许(三种实现方法)
2013/02/01 Javascript
jQuery+ajax实现动态执行脚本的方法
2015/01/27 Javascript
javascript实现简单的进度条
2015/07/02 Javascript
javascript 数组的正态分布排序的问题
2016/07/31 Javascript
详解Angular的双向数据绑定(MV-VM)
2016/12/26 Javascript
jQuery Position方法使用和兼容性
2017/08/23 jQuery
详解Vue.js组件可复用性的混合(mixin)方式和自定义指令
2017/09/06 Javascript
AngularJs分页插件使用详解
2018/06/30 Javascript
详解微信小程序文件下载--视频和图片
2019/04/24 Javascript
解决在layer.open中使用时间控件laydate失败的问题
2019/09/11 Javascript
JS 数组和对象的深拷贝操作示例
2020/06/06 Javascript
[03:44]2015国际邀请赛选手档案—Cloud9.NoTail
2015/07/28 DOTA
[01:14:12]2018DOTA2亚洲邀请赛4.7 总决赛 LGD vs Mineski 第二场
2018/04/09 DOTA
python求斐波那契数列示例分享
2014/02/14 Python
python 添加用户设置密码并发邮件给root用户
2016/07/25 Python
python,Java,JavaScript实现indexOf
2020/09/09 Python
详解python爬取弹幕与数据分析
2020/11/14 Python
详解如何在css3打包后自动追加前缀插件:autoprefixer
2018/12/18 HTML / CSS
网页中的电话号码如何实现一键直呼效果_附示例
2016/03/15 HTML / CSS
H5仿微信界面教程(一)
2017/07/05 HTML / CSS
海蓝之谜英国官网:La Mer英国
2020/01/15 全球购物
瀑布模型都有哪些优缺点
2014/06/23 面试题
在校学生职业规划范文
2014/01/08 职场文书
学生党员思想汇报范文
2014/01/09 职场文书
新员工试用期自我鉴定
2014/04/17 职场文书
专科应届毕业生求职信
2014/06/04 职场文书
竞选班长演讲稿400字
2014/08/22 职场文书
党的群众路线教育实践活动对照检查剖析材料
2014/10/09 职场文书
2014最新党员违纪检讨书
2014/10/12 职场文书
课外活动实习计划
2015/01/19 职场文书
居住证明范文
2015/06/17 职场文书
Django如何创作一个简单的最小程序
2021/05/12 Python
vite+vue3.0+ts+element-plus快速搭建项目的实现
2021/06/24 Vue.js