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中将网址转换为超链接的函数
Sep 02 PHP
PHP可变函数的使用详解
Jun 14 PHP
解析mysql 表中的碎片产生原因以及清理
Jun 22 PHP
PHP生成等比缩略图类和自定义函数分享
Jun 25 PHP
PHP基于CURL进行POST数据上传实例
Nov 10 PHP
php从文件夹随机读取文件的方法
Jun 01 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
Apr 11 PHP
php 微信公众平台开发模式实现多客服的实例代码
Nov 07 PHP
PHP基于自增数据如何生成不重复的随机数示例
May 19 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
Jun 29 PHP
thinkPHP框架自动填充原理与用法分析
Apr 03 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
Apr 21 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 之入门篇
2006/12/04 PHP
解析mysql中UNIX_TIMESTAMP()函数与php中time()函数的区别
2013/06/24 PHP
ThinkPHP CURD方法之field方法详解
2014/06/18 PHP
基于jquery实现的表格分页实现代码
2011/06/21 Javascript
jQuery 借助插件Lavalamp实现导航条动态美化效果
2013/09/27 Javascript
Ajax使用原生态JS验证用户名是否存在
2020/05/26 Javascript
利用纯Vue.js构建Bootstrap组件
2016/11/03 Javascript
利用JQuery阻止事件冒泡
2016/12/01 Javascript
JS实现的点击表头排序功能示例
2017/03/27 Javascript
微信小程序 监听手势滑动切换页面实例详解
2017/06/15 Javascript
jQuery.Ajax()的data参数类型详解
2017/07/23 jQuery
微信小程序支付之c#后台实现方法
2017/10/19 Javascript
Angularjs按需查询实例代码
2017/10/30 Javascript
jquery实现楼层滚动效果
2018/01/01 jQuery
vue左右侧联动滚动的实现代码
2018/06/06 Javascript
jQuery实现的自定义轮播图功能详解
2018/12/28 jQuery
JavaScript多种滤镜算法实现代码实例
2019/12/10 Javascript
[07:12]2014DOTA2西雅图国际邀请赛 黑马Liquid专题采访
2014/07/12 DOTA
[01:07:19]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第一场
2018/04/06 DOTA
Python中为什么要用self探讨
2015/04/14 Python
django接入新浪微博OAuth的方法
2015/06/29 Python
Python简单过滤字母和数字的方法小结
2019/01/09 Python
python实现五子棋小游戏
2020/03/25 Python
python系统指定文件的查找只输出目录下所有文件及文件夹
2020/01/19 Python
快速解决pymongo操作mongodb的时区问题
2020/12/05 Python
如何在vscode中安装python库的方法步骤
2021/01/06 Python
python中spy++的使用超详细教程
2021/01/29 Python
VSCode 自定义html5模板的实现
2019/12/05 HTML / CSS
猫咪家具:CatsPlay
2018/11/03 全球购物
法律专业个人实习自我鉴定
2013/09/23 职场文书
学生会副主席竞聘书
2014/03/31 职场文书
党建目标管理责任书
2014/07/25 职场文书
先进个人自荐书
2015/03/06 职场文书
MySQL系列之十 MySQL事务隔离实现并发控制
2021/07/02 MySQL
本地搭建minio文件服务器(使用bat脚本启动)的方法
2022/07/15 Servers
使用CSS实现百叶窗效果示例代码
2023/05/07 HTML / CSS