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服务器实现多session并发运行
Oct 09 PHP
php中一个有意思的日期逻辑处理
Mar 25 PHP
php动态实现表格跨行跨列实现代码
Nov 06 PHP
PHP CURL获取cookies模拟登录的方法
Nov 04 PHP
phpExcel中文帮助手册之常用功能指南
Aug 18 PHP
getimagesize获取图片尺寸实例
Nov 15 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
Sep 20 PHP
PHP与Ajax相结合实现登录验证小Demo
Mar 16 PHP
PHP使用FFmpeg获取视频播放总时长与码率等信息
Sep 13 PHP
php通过执行CutyCapt命令实现网页截图的方法
Sep 30 PHP
PHP实现mysqli批量执行多条语句的方法示例
Jul 22 PHP
PHP定义字符串的四种方式详解
Feb 06 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
德生BCL3000的电路分析和打磨
2021/03/02 无线电
php各种编码集详解和以及在什么情况下进行使用
2011/09/11 PHP
PHP imagecreatefrombmp 从BMP文件或URL新建一图像
2012/07/16 PHP
ThinkPHP实现ajax仿官网搜索功能实例
2014/12/02 PHP
php两种无限分类方法实例
2015/04/21 PHP
PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...
2016/02/14 PHP
JQuery中的$.getJSON 使用说明
2011/03/10 Javascript
JavaScript定义变量和变量优先级问题探讨
2014/10/11 Javascript
node.js中的fs.writeSync方法使用说明
2014/12/15 Javascript
JavaScript编程的单例设计模讲解
2015/11/10 Javascript
Angular实现购物车计算示例代码
2017/02/21 Javascript
vue2.0 axios前后端数据处理实例代码
2017/06/30 Javascript
手动下载Chrome并解决puppeteer无法使用问题
2018/11/12 Javascript
LayUI动态设置checkbox不显示的解决方法
2019/09/02 Javascript
three.js 利用uv和ThreeBSP制作一个快递柜功能
2020/08/18 Javascript
Python文件与文件夹常见基本操作总结
2016/09/19 Python
Python下的Softmax回归函数的实现方法(推荐)
2017/01/26 Python
python利用高阶函数实现剪枝函数
2018/03/20 Python
python搭建服务器实现两个Android客户端间收发消息
2018/04/12 Python
Python中几种属性访问的区别与用法详解
2018/10/10 Python
Django给admin添加Action的步骤详解
2019/05/01 Python
pytorch 模型的train模式与eval模式实例
2020/02/20 Python
python实现逢七拍腿小游戏的思路详解
2020/05/26 Python
python实现网页录音效果
2020/10/26 Python
python中二分查找法的实现方法
2020/12/06 Python
夏威夷航空官网:Hawaiian Airlines
2016/09/11 全球购物
Larsson & Jennings官网:现代瑞士钟表匠
2018/03/20 全球购物
世界领先的26岁以下学生和青少年旅行预订网站:StudentUniverse
2018/07/01 全球购物
公司行政经理岗位职责
2013/12/24 职场文书
运动会广播稿100字
2014/01/11 职场文书
《骑牛比赛》教后反思
2014/04/22 职场文书
大二学年个人总结
2015/03/03 职场文书
党员个人承诺书
2015/04/27 职场文书
2016年大学迎新工作总结
2015/10/14 职场文书
Go语言基础切片的创建及初始化示例详解
2021/11/17 Golang
Java 异步任务计算FutureTask
2022/04/28 Java/Android