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 相关文章推荐
通过ODBC连接的SQL SERVER实例
Oct 09 PHP
PHP的FTP学习(一)
Oct 09 PHP
使用HMAC-SHA1签名方法详解
Jun 26 PHP
codeigniter自带数据库类使用方法说明
Mar 25 PHP
smarty模板引擎从配置文件中获取数据的方法
Jan 22 PHP
php生成固定长度纯数字编码的方法
Jul 09 PHP
ThinkPHP框架搭建及常见问题(XAMPP安装失败、Apache/MySQL启动失败)
Apr 15 PHP
php原生导出excel文件的两种方法(推荐)
Nov 19 PHP
PHP面向对象程序设计方法实例详解
Dec 24 PHP
PHP中include()与require()的区别说明
Feb 14 PHP
YII2自动登录Cookie总是失效的解决方法
Jun 28 PHP
PHP分享图片的生成方法
Apr 25 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获取程序执行的时间
2013/06/09 PHP
PHP中比较时间大小实例
2014/08/21 PHP
Thinkphp3.2.3整合phpqrcode生成带logo的二维码
2016/07/21 PHP
PHP编程 SSO详细介绍及简单实例
2017/01/13 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
给artDialog 5.02 增加ajax get功能详细介绍
2012/11/13 Javascript
使用jquery实现以post打开新窗口
2014/03/19 Javascript
jquery 插件实现瀑布流图片展示实例
2015/04/03 Javascript
JQuery球队选择实例
2015/05/18 Javascript
ECMAScript6函数剩余参数(Rest Parameters)
2015/06/12 Javascript
JS实现的文字与图片定时切换效果代码
2015/10/06 Javascript
基于Jquery代码实现手风琴菜单
2015/11/19 Javascript
最全的Javascript编码规范(推荐)
2016/06/22 Javascript
浅析JavaScript中作用域和作用域链
2016/12/06 Javascript
根据输入邮箱号跳转到相应登录地址的解决方法
2016/12/13 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
2017/01/24 Javascript
JavaScript的数据类型转换原则(干货)
2018/03/15 Javascript
单页面vue引入百度统计的使用方法示例详解
2018/10/13 Javascript
javascript系统时间设置操作示例
2019/06/17 Javascript
[03:18]DOTA2放量测试专访820:希望玩家加入国服大家庭
2013/08/25 DOTA
用Python的urllib库提交WEB表单
2009/02/24 Python
用Python的Flask框架结合MySQL写一个内存监控程序
2015/11/07 Python
基于Python实现文件大小输出
2016/01/11 Python
Python的Flask框架中的Jinja2模板引擎学习教程
2016/06/30 Python
python爬虫入门教程--正则表达式完全指南(五)
2017/05/25 Python
python的pygal模块绘制反正切函数图像方法
2019/07/16 Python
使用Rasterio读取栅格数据的实例讲解
2019/11/26 Python
Django静态资源部署404问题解决方案
2020/05/11 Python
python3.7调试的实例方法
2020/07/21 Python
浅析HTML5页面元素及属性
2021/01/20 HTML / CSS
蔻驰意大利官网:COACH意大利
2019/01/16 全球购物
FC-Moto西班牙:摩托车手最大的购物场所之一
2019/04/11 全球购物
集世界奢侈品和设计师品牌的意大利精品买手店:Tessabit
2019/08/17 全球购物
致跳远运动员广播稿
2014/02/11 职场文书
工作批评与自我批评范文
2014/10/16 职场文书
Python下opencv库的安装过程及问题汇总
2021/06/11 Python