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 修改zen-cart下单和付款流程以防止漏单
Mar 08 PHP
php 数据库字段复用的基本原理与示例
Jul 22 PHP
用穿越火线快速入门php面向对象
Feb 22 PHP
php使用百度ping服务代码实例
Jun 19 PHP
浅析application/x-www-form-urlencoded和multipart/form-data的区别
Jun 22 PHP
PHP图像处理之使用imagecolorallocate()函数设置颜色例子
Nov 19 PHP
yii的CURD操作实例详解
Dec 04 PHP
PHP Static延迟静态绑定用法分析
Mar 16 PHP
ZendFramework框架实现连接两个或多个数据库的方法
Dec 08 PHP
利用php操作memcache缓存的基础方法示例
Aug 02 PHP
自写的利用PDO对mysql数据库增删改查操作类
Feb 19 PHP
Yii框架的布局文件实例分析
Sep 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
Yii2验证器(Validator)用法分析
2016/07/23 PHP
详解php与ethereum客户端交互
2018/04/28 PHP
拖动布局之保存布局页面cookies篇
2010/10/29 Javascript
js网页版计算器的简单实现
2013/07/02 Javascript
ExtJS DOM元素操作经验分享
2013/08/28 Javascript
jquery easyui combox一些实用的小方法
2013/12/25 Javascript
JS数组的遍历方式for循环与for...in
2014/07/31 Javascript
JS简单实现城市二级联动选择插件的方法
2015/08/19 Javascript
jQuery中ajax的load()与post()方法实例详解
2016/01/05 Javascript
全面解析bootstrap格子布局
2016/05/22 Javascript
整理一些最近经常遇到的前端面试题
2017/04/25 Javascript
Vue通过input筛选数据
2020/10/26 Javascript
AngularJS  ng-repeat遍历输出的用法
2017/06/19 Javascript
Angular排序实例详解
2017/06/28 Javascript
vue移动UI框架滑动加载数据的方法
2018/03/12 Javascript
JS打印彩色菱形的实例代码
2018/08/15 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧不动,右侧滑动)
2019/01/23 Javascript
vue 更改连接后台的api示例
2019/11/11 Javascript
JS删除数组指定值常用方法详解
2020/06/04 Javascript
python fabric使用笔记
2015/05/09 Python
Python可变参数函数用法实例
2015/07/07 Python
python基础教程之匿名函数lambda
2017/01/17 Python
Python基础知识_浅谈用户交互
2017/05/31 Python
python下载图片实现方法(超简单)
2017/07/21 Python
python删除服务器文件代码示例
2018/02/09 Python
python pycharm的安装及其使用
2019/10/11 Python
python argparse传入布尔参数false不生效的解决
2020/04/20 Python
Python+OpenCV图像处理——实现直线检测
2020/10/23 Python
如何写自我鉴定
2014/03/19 职场文书
国旗下演讲稿
2014/05/08 职场文书
战友聚会策划方案
2014/06/13 职场文书
餐饮服务食品安全责任书
2014/07/25 职场文书
个人对照检查材料思想汇报(四风问题)
2014/09/25 职场文书
单位推荐信范文
2015/03/27 职场文书
2016中秋节广告语
2016/01/28 职场文书
HashMap实现保存两个key相同的数据
2021/06/30 Java/Android