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 相关文章推荐
使用TinyButStrong模板引擎来做WEB开发
Mar 16 PHP
PHP下编码转换函数mb_convert_encoding与iconv的使用说明
Dec 16 PHP
探讨PHP中this,self,parent的区别详解
Jun 08 PHP
PHP Class&amp;Object -- PHP 自排序二叉树的深入解析
Jun 25 PHP
PHP与Java进行通信的实现方法
Oct 21 PHP
php实现parent调用父类的构造方法与被覆写的方法
Feb 11 PHP
PHP curl伪造IP地址和header信息代码实例
Apr 27 PHP
常见PHP数据库解决方案分析介绍
Sep 24 PHP
php开发微信支付获取用户地址
Oct 04 PHP
php中简单的对称加密算法实现
Jan 05 PHP
PHP获取数组中指定的一列实例
Dec 27 PHP
PHP+redis实现微博的拉模型案例详解
Jul 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读取大文件的多种方法介绍
2016/04/04 PHP
PHP简单实现冒泡排序的方法
2016/12/26 PHP
php使用curl实现简单模拟提交表单功能
2017/05/15 PHP
PHP CURL使用详解
2019/03/21 PHP
PHP创建XML接口示例
2019/07/04 PHP
File文件控件,选中文件(图片,flash,视频)即立即预览显示
2009/04/09 Javascript
jquery 分页控件实现代码
2009/11/30 Javascript
JavaScript Eval 函数使用
2010/03/23 Javascript
Ext.get() 和 Ext.query()组合使用实现最灵活的取元素方式
2011/09/26 Javascript
在js中判断checkboxlist(.net控件客户端id)是否有选中
2013/04/11 Javascript
jQuery中$(function() {});问题详解
2015/08/10 Javascript
学习javascript面向对象 实例讲解面向对象选项卡
2016/01/04 Javascript
解析js如何获取css样式
2016/12/11 Javascript
js 去掉字符串前后空格实现代码集合
2017/03/25 Javascript
Vue.js对象转换实例
2017/06/07 Javascript
从vue源码看props的用法
2019/01/09 Javascript
Vue实现简单购物车功能
2020/12/13 Vue.js
Vue 组件注册全解析
2020/12/17 Vue.js
Python字符串处理之count()方法的使用
2015/05/18 Python
Python 提取dict转换为xml/json/table并输出的实现代码
2016/08/28 Python
Python实现将一个正整数分解质因数的方法分析
2017/12/14 Python
Python获取指定字符前面的所有字符方法
2018/05/02 Python
使用apiDoc实现python接口文档编写
2019/11/19 Python
Python实现搜索算法的实例代码
2020/01/02 Python
通过 Python 和 OpenCV 实现目标数量监控
2020/01/05 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
2020/07/03 Python
html5 touch事件实现页面上下滑动效果【附代码】
2016/03/10 HTML / CSS
HTML5本地存储之Database Storage应用介绍
2013/01/06 HTML / CSS
澳大利亚拥有最佳跳伞降落点和最好服务的跳伞项目运营商:Skydive Australia
2018/03/05 全球购物
.NET面试题:什么是值类型和引用类型
2016/01/12 面试题
幼儿园运动会加油词
2014/02/14 职场文书
出生公证委托书
2014/04/03 职场文书
2014入党积极分子破除“四风”思想汇报
2014/09/14 职场文书
教师师德师风整改措施
2014/10/24 职场文书
2015年高三年级组工作总结
2015/07/21 职场文书
golang import自定义包方式
2021/04/29 Golang