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.ini中文版
Oct 09 PHP
屏蔽浏览器缓存另类方法
Oct 09 PHP
PHP CURL模拟GET及POST函数代码
Apr 25 PHP
PHP服务器页面间跳转实现方法
Aug 02 PHP
解析php取整的几种方式
Jun 25 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
Dec 23 PHP
thinkphp3.x中cookie方法的用法分析
May 19 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
Nov 16 PHP
PHP简单实现解析xml为数组的方法
May 02 PHP
PHP实现上传图片到数据库并显示输出的方法
May 31 PHP
PHP程序员学习使用Swoole的理由
Jun 24 PHP
laravel 实现设置时区的简单方法
Oct 10 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 Mysql类 可以参考学习熟悉下
2009/06/21 PHP
PHP下escape解码函数的实现方法
2010/08/08 PHP
ajax php传递和接收变量实现思路及代码
2012/12/19 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
Yii使用技巧大汇总
2015/12/29 PHP
postman的安装与使用方法(模拟Get和Post请求)
2018/08/06 PHP
js变换显示图片的实例
2013/04/16 Javascript
Javascript浅谈之this
2013/12/17 Javascript
理解javascript中的回调函数(callback)
2014/09/02 Javascript
jQuery自动完成插件completer附源码下载
2016/01/04 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
2016/02/16 Javascript
JQuery实现简单的服务器轮询效果实例
2016/03/31 Javascript
Winform客户端向web地址传参接收参数的方法
2016/05/17 Javascript
简单谈谈Vue 模板各类数据绑定
2016/09/25 Javascript
vue resource post请求时遇到的坑
2017/10/19 Javascript
jQuery实现定时隐藏对话框的方法分析
2018/02/12 jQuery
JavaScript满天星导航栏实现方法
2018/03/08 Javascript
详解vuex的简单todolist例子
2019/07/14 Javascript
django通过ajax发起请求返回JSON格式数据的方法
2015/06/04 Python
Python实现矩阵转置的方法分析
2017/11/24 Python
Python中的pygal安装和绘制直方图代码分享
2017/12/08 Python
Ubuntu下使用python读取doc和docx文档的内容方法
2018/05/08 Python
python 二维数组90度旋转的方法
2019/01/28 Python
python接口自动化框架实战
2020/12/23 Python
Nike墨西哥官网:Nike MX
2020/08/30 全球购物
自荐信怎么写好
2013/11/11 职场文书
顶岗实习接收函
2014/01/09 职场文书
运动会100米解说词
2014/01/23 职场文书
西安交大自主招生自荐信
2014/01/27 职场文书
集体备课反思
2014/02/12 职场文书
《诚实与信任》教学反思
2014/04/10 职场文书
教师自我剖析材料(四风问题)
2014/09/30 职场文书
2015年学生会部门工作总结
2015/04/21 职场文书
2015年清剿火患专项行动工作总结
2015/07/27 职场文书
新手初学Java List 接口
2021/07/07 Java/Android
Mysql将字符串按照指定字符分割的正确方法
2022/05/30 MySQL