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&amp;mysql(一)
Oct 09 PHP
实现了一个PHP5的getter/setter基类的代码
Feb 25 PHP
利用php+mysql来做一个功能强大的在线计算器
Oct 12 PHP
PHP中判断变量为空的几种方法小结
Nov 12 PHP
php数组操作之键名比较与差集、交集赋值的方法
Nov 10 PHP
html静态页面调用php文件的方法
Nov 13 PHP
php判断两个日期之间相差多少个月份的方法
Jun 18 PHP
使用PHP接受文件并获得其后缀名的方法
Aug 05 PHP
php递归函数三种实现方法及如何实现数字累加
Aug 07 PHP
php实现微信公众号主动推送消息
Dec 31 PHP
Yii中创建自己的Widget实例
Jan 05 PHP
PHP面向对象之事务脚本模式(详解)
Jun 07 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
phpmyadmin配置文件现在需要绝密的短密码(blowfish_secret)的2种解决方法
2014/05/07 PHP
php判断当前用户已在别处登录的方法
2015/01/06 PHP
php发送与接收流文件的方法
2015/02/11 PHP
ThinkPHP5&amp;5.1实现验证码的生成、使用及点击刷新功能示例
2020/02/07 PHP
屏蔽Flash右键信息的js代码
2010/01/17 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
2013/07/31 Javascript
jquery选择器之属性过滤选择器详解
2014/01/27 Javascript
JavaScript sub方法入门实例(把字符串显示为下标)
2014/10/17 Javascript
jquery删除指定子元素代码实例
2015/01/13 Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
2015/12/30 Javascript
JS实现超简单的汉字转拼音功能示例
2016/12/22 Javascript
angularjs中回车键触发某一事件的方法
2017/04/24 Javascript
Vue Ajax跨域请求实例详解
2017/06/20 Javascript
Javascript迭代、递推、穷举、递归常用算法实例讲解
2019/02/01 Javascript
js实现百度淘宝搜索功能
2020/02/17 Javascript
Kettle中使用JavaScrip调用jar包对文件内容进行MD5加密的操作方法
2020/09/04 Javascript
详解 javascript对象创建模式
2020/10/30 Javascript
[01:05:56]2018DOTA2亚洲邀请赛3月29日 小组赛A组 Newbee VS VG
2018/03/30 DOTA
对于Python中线程问题的简单讲解
2015/04/03 Python
python复制文件的方法实例详解
2015/05/22 Python
浅谈Python2.6和Python3.0中八进制数字表示的区别
2017/04/28 Python
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
对python3标准库httpclient的使用详解
2018/12/18 Python
python实现可逆简单的加密算法
2019/03/22 Python
浅谈Python中threading join和setDaemon用法及区别说明
2020/05/02 Python
HTML5添加禁止缩放功能
2017/11/03 HTML / CSS
艺术专业大学生自我评价
2013/09/22 职场文书
教师自荐书
2013/10/08 职场文书
采购主管的岗位职责
2013/12/17 职场文书
婚前协议书范本
2014/04/15 职场文书
共产党员批评与自我批评
2014/10/15 职场文书
2015年商场工作总结
2015/04/27 职场文书
就业意向书范本
2015/05/11 职场文书
校园歌手大赛主持词
2015/07/03 职场文书
一篇文章弄懂MySQL查询语句的执行过程
2021/05/07 MySQL
如何利用Python实现一个论文降重工具
2021/07/09 Python