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 相关文章推荐
第七节 类的静态成员 [7]
Oct 09 PHP
php,不用COM,生成excel文件
Oct 09 PHP
php中使用redis队列操作实例代码
Feb 07 PHP
ThinkPHP实例化模型的四种方法概述
Aug 22 PHP
php模拟用户自动在qq空间发表文章的方法
Jan 07 PHP
php使用curl并发减少后端访问时间的方法分析
May 12 PHP
thinkPHP统计排行与分页显示功能示例
Dec 02 PHP
PHP使用Redis替代文件存储Session的方法
Feb 15 PHP
PHP中数组转换为SimpleXML教程
Jan 27 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
Mar 11 PHP
php实现QQ小程序发送模板消息功能
Sep 18 PHP
thinkPHP+LayUI 流加载实现功能
Sep 27 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学习之数组值的操作
2011/04/17 PHP
百度地图API使用方法详解
2015/08/25 PHP
php 微信开发获取用户信息如何实现
2016/12/13 PHP
setTimeout与setInterval在不同浏览器下的差异
2010/01/24 Javascript
基于jquery的页面划词搜索JS
2010/09/14 Javascript
js操作textarea 常用方法总结
2012/12/03 Javascript
jQuery使用hide方法隐藏页面上指定元素的方法
2015/03/30 Javascript
JS实现网页Div层Clone拖拽效果
2015/09/26 Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
2016/10/25 Javascript
完美解决spring websocket自动断开连接再创建引发的问题
2017/03/02 Javascript
JavaScript表单验证实现代码
2017/05/22 Javascript
JS实现搜索关键词的智能提示功能
2017/07/07 Javascript
js中null与空字符串&quot;&quot;的区别讲解
2019/01/17 Javascript
在layui中对table中的数据进行判断(0、1)转换为提示信息的方法
2019/09/28 Javascript
微信公众号开发之微信支付代码记录的实现
2019/10/16 Javascript
vue不操作dom实现图片轮播的示例代码
2019/12/18 Javascript
jquery.validate自定义验证用法实例分析【成功提示与择要提示】
2020/06/06 jQuery
Vue如何实现监听组件原生事件
2020/07/03 Javascript
JS跨浏览器解析XML应用过程详解
2020/10/16 Javascript
[33:39]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第二局
2016/02/27 DOTA
[01:11:21]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第三场 3月7日
2021/03/11 DOTA
收集的几个Python小技巧分享
2014/11/22 Python
Python 通过pip安装Django详细介绍
2017/04/28 Python
Python开发虚拟环境使用virtualenvwrapper的搭建步骤教程图解
2018/09/19 Python
tensorflow中tf.slice和tf.gather切片函数的使用
2020/01/19 Python
python实现逢七拍腿小游戏的思路详解
2020/05/26 Python
Python爬虫后获取重定向url的两种方法
2021/01/19 Python
HTML5 WebGL 实现民航客机飞行监控系统
2019/07/25 HTML / CSS
用HTML5制作烟火效果的教程
2015/05/12 HTML / CSS
英国性感内衣和睡衣品牌:Bluebella
2018/01/26 全球购物
德国最大的网上足球商店:11teamsports
2019/09/11 全球购物
一些关于MySql加速和优化的面试题
2014/01/30 面试题
大学自主招生自荐信
2013/12/16 职场文书
2014年环保局工作总结
2014/12/11 职场文书
MongoDB日志切割的三种方式总结
2021/09/15 MongoDB
JavaWeb Servlet开发注册页面实例
2022/04/11 Java/Android