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文件的实现方法
Mar 19 PHP
用PHP调用Oracle存储过程的方法
Sep 12 PHP
php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
Oct 22 PHP
php学习之数据类型之间的转换代码
May 29 PHP
PHP关于IE下的iframe跨域导致session丢失问题解决方法
Oct 10 PHP
php过滤所有的空白字符(空格、全角空格、换行等)
Oct 27 PHP
微信自定义分享php代码分析
Nov 24 PHP
PHP用函数嵌入网站访问量计数器
Oct 27 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
Nov 17 PHP
php 广告点击统计代码(php+mysql)
Feb 21 PHP
php 多继承的几种常见实现方法示例
Nov 18 PHP
PHP7变量处理机制修改
Mar 09 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 上一篇,下一篇文章实现代码与原理说明
2010/05/09 PHP
PHP句法规则详解 入门学习
2011/11/09 PHP
自己写的php中文截取函数mb_strlen和mb_substr
2015/02/09 PHP
PHP环境搭建的详细步骤
2016/06/30 PHP
详解EventDispatcher事件分发组件
2016/12/25 PHP
jquery 插件学习(一)
2012/08/06 Javascript
web基于浏览器的本地存储方法应用
2012/11/27 Javascript
浅析JQuery获取和设置Select选项的常用方法总结
2013/07/04 Javascript
给事件响应函数传参数的四种方式小结
2013/12/05 Javascript
javascript表单验证大全
2015/08/12 Javascript
代码实例ajax实现点击加载更多数据图片
2018/10/12 Javascript
利用Promise自定义一个GET请求的函数示例代码
2019/03/20 Javascript
Vue使用Canvas绘制图片、矩形、线条、文字,下载图片
2019/04/26 Javascript
推荐几个不错的console调试技巧实现
2019/12/20 Javascript
下载糗事百科的内容_python版
2008/12/07 Python
python实现文本文件合并
2015/12/29 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
2019/01/29 Python
通过pycharm使用git的步骤(图文详解)
2019/06/13 Python
Python调用接口合并Excel表代码实例
2020/03/31 Python
pytorch加载自己的图像数据集实例
2020/07/07 Python
解决Pycharm 运行后没有输出的问题
2021/02/05 Python
CSS3 简写animation
2012/05/10 HTML / CSS
canvas绘制文本内容自动换行的实现代码
2019/01/14 HTML / CSS
J2EE包括哪些技术
2016/11/25 面试题
应届生妇产科护士求职信
2013/10/27 职场文书
应届生财务管理求职信
2013/11/06 职场文书
关于礼仪的演讲稿
2014/01/04 职场文书
文明教师事迹材料
2014/01/16 职场文书
《威尼斯的小艇》教学反思
2014/02/17 职场文书
防灾减灾宣传标语
2014/10/07 职场文书
2015国际残疾人日活动总结
2015/03/24 职场文书
国庆阅兵观后感
2015/06/15 职场文书
趣味运动会简讯
2015/07/20 职场文书
2015年小学教科研工作总结
2015/07/20 职场文书
《群青的幻想曲》京力秋树角色PV公开
2022/04/08 日漫
Python自动操作神器PyAutoGUI的使用教程
2022/06/16 Python