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数据库开发知多少
Oct 09 PHP
如何使用PHP中的字符串函数
Nov 24 PHP
php中的时间显示
Jan 18 PHP
可以在线执行PHP代码包装修正版
Mar 15 PHP
163的邮件用phpmailer发送(实例详解)
Jun 24 PHP
PHP GD库生成图像的几个函数总结
Nov 19 PHP
ThinkPHP模板输出display用法分析
Nov 26 PHP
php实现约瑟夫问题的方法小结
Mar 23 PHP
php实现将Session写入数据库
Jul 26 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
Oct 22 PHP
php利用fsockopen GET/POST提交表单及上传文件
May 22 PHP
PHP后门隐藏的一些技巧总结
Nov 04 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完整的日历类(CLASS)
2006/11/27 PHP
PHP 类相关函数的使用详解
2013/05/10 PHP
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
2014/06/19 PHP
Thinkphp极验滑动验证码实现步骤解析
2020/11/24 PHP
JQuery验证工具类搜集整理
2013/01/16 Javascript
jquery图片放大功能简单实现
2013/08/01 Javascript
node.js中的console.warn方法使用说明
2014/12/09 Javascript
浅谈javascript中自定义模版
2015/01/29 Javascript
javascript无刷新评论实现方法
2015/05/13 Javascript
用JavaScript实现页面重定向功能的教程
2015/06/04 Javascript
JS使用cookie实现DIV提示框只显示一次的方法
2015/11/05 Javascript
分享15个大家都熟知的jquery小技巧
2015/12/02 Javascript
开启BootStrap学习之旅
2016/05/04 Javascript
AngularJS基础 ng-keyup 指令简单示例
2016/08/02 Javascript
jquery获取点击控件的绝对位置简单实例
2016/10/13 Javascript
原生JS实现跑马灯效果
2017/02/20 Javascript
Vue.js实现移动端短信验证码功能
2017/03/29 Javascript
vue仿淘宝订单状态的tab切换效果
2020/06/23 Javascript
jQuery模仿ToDoList实现简单的待办事项列表
2019/12/30 jQuery
在NodeJs中使用node-schedule增加定时器任务的方法
2020/06/08 NodeJs
[58:57]2018DOTA2亚洲邀请赛3月29日小组赛B组 Effect VS VGJ.T
2018/03/30 DOTA
Windows下Python2与Python3两个版本共存的方法详解
2017/02/12 Python
wxPython之解决闪烁的问题
2018/01/15 Python
Python数据分析之双色球中蓝红球分析统计示例
2018/02/03 Python
python爬虫超时的处理的实例
2018/12/19 Python
python+selenium 鼠标事件操作方法
2019/08/24 Python
Django restframework 框架认证、权限、限流用法示例
2019/12/21 Python
解决Pytorch训练过程中loss不下降的问题
2020/01/02 Python
python实现秒杀商品的微信自动提醒功能(代码详解)
2020/04/27 Python
Python基于tkinter canvas实现图片裁剪功能
2020/11/05 Python
会计实习生工作总结的自我评价
2013/10/07 职场文书
2014学校庆三八妇女节活动总结
2014/03/01 职场文书
部门活动策划方案
2014/08/16 职场文书
党政领导班子群众路线对照检查材料思想汇报
2014/09/27 职场文书
中学生检讨书1000字
2014/10/28 职场文书
优秀教师工作总结2015
2015/07/22 职场文书