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判断手机访问还是电脑访问示例分享
Jan 20 PHP
php多功能图片处理类分享(php图片缩放类)
Mar 14 PHP
php可生成缩略图的文件上传类实例
Dec 17 PHP
php实现用于删除整个目录的递归函数
Mar 16 PHP
php将日期格式转换成xx天前的格式
Apr 16 PHP
php实现短信发送代码
Jul 05 PHP
PHP之正则表达式捕获组与非捕获组(详解)
Jul 29 PHP
详解PHP用substr函数截取字符串中的某部分
Dec 03 PHP
PHP简单计算两个时间差的方法示例
Jun 20 PHP
实例讲解PHP表单验证功能
Feb 15 PHP
PHP通过GD库实现验证码功能示例
Feb 23 PHP
解决laravel groupBy 对查询结果进行分组出现的问题
Oct 09 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中的日期加减方法示例
2014/08/21 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
ExtJS 2.0实用简明教程之应用ExtJS
2009/04/29 Javascript
javascipt基础内容--需要注意的细节
2013/04/10 Javascript
jQuery EasyUI菜单与按钮详解
2016/07/13 Javascript
jQuery实现下拉菜单的实例代码
2017/06/19 jQuery
async/await地狱该如何避免详解
2018/05/10 Javascript
npm的lock机制解析
2019/06/20 Javascript
Vue export import 导入导出的多种方式与区别介绍
2020/02/12 Javascript
vue+animation实现翻页动画
2020/06/29 Javascript
vue组件开发之tab切换组件使用详解
2020/08/21 Javascript
[05:09]2016国际邀请赛中国区预选赛淘汰赛首日精彩回顾
2016/06/29 DOTA
Python基于scapy实现修改IP发送请求的方法示例
2017/07/08 Python
python实现单链表中删除倒数第K个节点的方法
2018/09/28 Python
Python 合并多个TXT文件并统计词频的实现
2019/08/23 Python
Python中的相关分析correlation analysis的实现
2019/08/29 Python
Python使用pdb调试代码的技巧
2020/05/03 Python
python对 MySQL 数据库进行增删改查的脚本
2020/10/22 Python
Pycharm 解决自动格式化冲突的设置操作
2021/01/15 Python
详解CSS3 用border写 空心三角箭头 (两种写法)
2017/09/29 HTML / CSS
使用layui框架实现点击左侧导航切换右侧内容且右侧选项卡跟随变化的效果
2020/11/10 HTML / CSS
Expedia印度尼西亚站:预订酒店、廉价航班和度假套餐
2018/01/31 全球购物
德国滑雪和户外用品网上商店:XSPO
2019/10/30 全球购物
致百米运动员广播稿
2014/01/29 职场文书
竞聘演讲稿开场白
2014/08/25 职场文书
领导班子党的群众路线对照检查材料
2014/09/25 职场文书
工作失职检讨书(精华篇)
2014/10/15 职场文书
2015商场元旦促销活动策划方案
2014/12/09 职场文书
承诺书模板大全
2015/05/04 职场文书
小学运动会通讯稿
2015/07/18 职场文书
大学生志愿者心得体会
2016/01/15 职场文书
MySQL索引知识的一些小妙招总结
2021/05/10 MySQL
Java Spring 控制反转(IOC)容器详解
2021/10/05 Java/Android
Win11怎么跳过联网验机 ?Win11跳过联网验机激活教程
2022/04/05 数码科技
JAVA springCloud项目搭建流程
2022/05/11 Java/Android
阿里面试Nacos配置中心交互模型是push还是pull原理解析
2022/07/23 Java/Android