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 相关文章推荐
关于file_get_contents返回为空或函数不可用的解决方案
Jun 24 PHP
使用Sphinx对索引进行搜索
Jun 25 PHP
php实现图片添加水印功能
Feb 13 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
Nov 19 PHP
在php和MySql中计算时间差的方法详解
Mar 27 PHP
FastCGI 进程意外退出造成500错误
Jul 26 PHP
PHP常用工具类大全附全部代码下载
Dec 07 PHP
Laravel中Facade的加载过程与原理详解
Sep 22 PHP
ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
Apr 02 PHP
PHP使用PDO、mysqli扩展实现与数据库交互操作详解
Jul 20 PHP
Laravel 不同生产环境服务器的判断实践
Oct 15 PHP
Yii2框架中一些折磨人的坑
Dec 15 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
模仿OSO的论坛(四)
2006/10/09 PHP
php5 non-thread-safe和thread-safe这两个版本的区别分析
2010/03/13 PHP
关于laravel5.5的定时任务详解(demo)
2019/10/23 PHP
Laravel 修改验证异常的响应格式实例代码详解
2020/05/25 PHP
JavaScript的目的分析
2007/01/05 Javascript
javascript表格的渲染组件
2015/07/03 Javascript
jquery 表单验证之通过 class验证表单不为空
2015/11/02 Javascript
Bootstrap每天必学之警告框插件
2016/04/26 Javascript
js表单元素checked、radio被选中的几种方法(详解)
2016/08/22 Javascript
vue.js树形组件之删除双击增加分支实例代码
2017/02/28 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
2017/03/02 Javascript
微信小程序 首页制作简单实例
2017/04/07 Javascript
薪资那么高的Web前端必看书单
2017/10/13 Javascript
nodeJS模块简单用法示例
2018/04/21 NodeJs
微信小程序bindtap事件与冒泡阻止详解
2019/08/08 Javascript
[51:05]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第一局
2016/03/06 DOTA
Python中实现常量(Const)功能
2015/01/28 Python
各个系统下的Python解释器相关安装方法
2015/10/12 Python
Python 实现文件的全备份和差异备份详解
2016/12/27 Python
Python给你的头像加上圣诞帽
2018/01/04 Python
python 图像平移和旋转的实例
2019/01/10 Python
pyqt5使用按钮进行界面的跳转方法
2019/06/19 Python
十行代码使用Python写一个USB病毒
2019/06/21 Python
为什么称python为胶水语言
2020/06/16 Python
澳大利亚便宜的家庭购物网站:CrazySales
2018/02/06 全球购物
Ted Baker美国官网:英国时尚品牌
2018/10/29 全球购物
泰国王权免税店官方网站:KingPower
2019/03/11 全球购物
冰淇淋店创业计划书范文
2013/12/27 职场文书
中秋节礼品促销方案
2014/02/02 职场文书
酒店管理毕业生自我鉴定
2014/03/02 职场文书
住宅质量保证书
2014/04/29 职场文书
医学生求职信
2014/07/01 职场文书
《中国梦我的梦》大学生演讲稿
2014/08/20 职场文书
查摆问题对照检查材料
2014/08/28 职场文书
银行转正自我鉴定
2014/09/29 职场文书
redis客户端实现高可用读写分离的方式详解
2021/07/04 Redis