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
php 防止单引号,双引号在接受页面转义
Jul 10 PHP
解析php 版获取重定向后的地址(代码)
Jun 26 PHP
php获取表单中多个同名input元素的值
Mar 20 PHP
PHP简单实现“相关文章推荐”功能的方法
Jul 19 PHP
php+mysqli批量查询多张表数据的方法
Jan 29 PHP
php获取网站百度快照日期的方法
Jul 29 PHP
smarty简单应用实例
Nov 03 PHP
WordPress后台中实现图片上传功能的实例讲解
Jan 11 PHP
PHP按符号截取字符串的指定部分的实现方法
Sep 10 PHP
yii框架数据库关联查询操作示例
Oct 14 PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
Dec 13 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 短链接算法收集与分析
2011/12/30 PHP
php解析xml 的四种简单方法(附实例)
2016/07/11 PHP
获取当前网页document.url location.href区别总结
2008/05/10 Javascript
解决extjs在firefox中关闭窗口再打开后iframe中js函数访问不到的问题
2008/11/06 Javascript
jquery 跳到顶部和底部动画2句代码简单实现
2013/07/18 Javascript
解决JavaScript数字精度丢失问题的方法
2015/12/03 Javascript
js+html5实现canvas绘制椭圆形图案的方法
2016/05/21 Javascript
第九篇Bootstrap导航菜单创建步骤详解
2016/06/21 Javascript
javascript的document中的动态添加标签实现方法
2016/10/24 Javascript
漂亮实用的页面loading(加载)封装代码
2017/02/03 Javascript
Nodejs--post的公式详解
2017/04/29 NodeJs
vue超时计算的组件实例代码
2018/07/09 Javascript
node.js中TCP Socket多进程间的消息推送示例详解
2018/07/10 Javascript
[03:24]2014DOTA2国际邀请赛 神秘商店生意火爆
2014/07/18 DOTA
[43:24]VG vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python中逗号的三种作用实例分析
2015/06/08 Python
python爬虫实战之爬取京东商城实例教程
2017/04/24 Python
zookeeper python接口实例详解
2018/01/18 Python
Python3多目标赋值及共享引用注意事项
2019/05/27 Python
python实现雪花飘落效果实例讲解
2019/06/18 Python
python多线程案例之多任务copy文件完整实例
2019/10/29 Python
详解Django CAS 解决方案
2019/10/30 Python
使用python代码进行身份证号校验的实现示例
2019/11/21 Python
Scrapy框架基本命令与settings.py设置
2020/02/06 Python
DOUGLAS波兰:在线销售香水和化妆品
2020/07/05 全球购物
星空联盟C# .net笔试题
2014/12/05 面试题
乐观大学生的自我评价
2014/01/10 职场文书
十岁生日同学答谢词
2014/01/19 职场文书
家长寄语大全
2014/04/02 职场文书
国庆宣传标语
2014/06/30 职场文书
争先创优活动总结
2014/08/27 职场文书
车辆转让协议书
2014/09/24 职场文书
银行委托书范本
2014/09/28 职场文书
小学开学典礼新闻稿
2015/07/17 职场文书
mysql查询的控制语句图文详解
2021/04/11 MySQL
【D4DJ】美少女DJ企划 动画将于明年冬季开播第2季
2022/04/11 日漫