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 相关文章推荐
Windows下IIS6/Apache2.2.4+MySQL5.2+PHP5.2.1安装配置方法
May 03 PHP
PHP 裁剪图片成固定大小代码方法
Sep 09 PHP
按上下级层次关系输出内容的PHP代码
Jul 17 PHP
php数组函数序列之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值
Oct 31 PHP
php连接Access数据库错误及解决方法
Jun 20 PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
Jul 23 PHP
php中fsockopen用法实例
Jan 05 PHP
注意!PHP 7中不要做的10件事
Sep 18 PHP
利用php操作memcache缓存的基础方法示例
Aug 02 PHP
php实现的AES加密类定义与用法示例
Jan 29 PHP
基于PHP实现用户在线状态检测
Nov 10 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
Mar 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
增加反向链接的101个方法 站长推荐
2007/01/31 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
2014/06/23 PHP
ioncube_loader_win_5.2.dll的错误解决方法
2015/01/04 PHP
Laravel实现构造函数自动依赖注入的方法
2016/03/16 PHP
php获取远程图片并下载保存到本地的方法分析
2016/10/08 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
PHP多维数组指定多字段排序的示例代码
2018/05/16 PHP
PHP 访问数据库配置通用方法(json)
2018/05/20 PHP
Laravel框架Auth用户认证操作实例分析
2019/09/29 PHP
JS控制表格隔行变色
2006/06/26 Javascript
克隆javascript对象的三个方法小结
2011/01/12 Javascript
js中eval()函数和trim()去掉字符串左右空格应用
2013/02/02 Javascript
jQuery用unbind方法去掉hover事件及其他方法介绍
2013/03/18 Javascript
让页面上两个div中的滚动条(滑块)同步运动示例
2013/08/07 Javascript
弹出窗口并且此窗口带有半透明的遮罩层效果
2014/03/13 Javascript
基于jquery实现简单的手风琴特效
2015/11/24 Javascript
JavaScript判断对象是否为数组
2015/12/22 Javascript
jQuery实现贪吃蛇小游戏(附源码下载)
2017/03/04 Javascript
详解plotly.js 绘图库入门使用教程
2018/02/23 Javascript
vue仿ios列表左划删除
2019/09/26 Javascript
Vue常用传值方式、父传子、子传父及非父子实例分析
2020/02/24 Javascript
vue实现商品列表的添加删除实例讲解
2020/05/14 Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
2020/08/11 Javascript
Python获取当前时间的方法
2014/01/14 Python
Python升级导致yum、pip报错的解决方法
2017/09/06 Python
Python for循环生成列表的实例
2018/06/15 Python
CSS3实现粒子旋转伸缩加载动画
2016/04/22 HTML / CSS
CSS3控制HTML元素动画效果
2014/02/08 HTML / CSS
详解如何通过H5(浏览器/WebView/其他)唤起本地app
2017/12/11 HTML / CSS
澳大利亚在线购买儿童玩具:Toy Universe
2017/12/28 全球购物
让世界充满爱演讲稿
2014/05/24 职场文书
2015年保险公司工作总结
2015/04/24 职场文书
听证通知书
2015/04/24 职场文书
毕业生学校组织意见
2015/06/04 职场文书
简单聊聊Vue中的计算属性和属性侦听
2021/10/05 Vue.js
VUE之图片Base64编码使用ElementUI组件上传
2022/04/09 Vue.js