php设计模式之组合模式实例详解【星际争霸游戏案例】


Posted in PHP onMarch 27, 2020

本文实例讲述了php设计模式之组合模式。分享给大家供大家参考,具体如下:

星际里面我们可以下载别人制作的地图,或者自己做地图玩。

我们在选择玩哪张地图的时候,可以看到游戏列出当前地图包里面的地图或地图包的名字。

虽然地图和地图包是通过文件和文件夹区分的,但是我们开发的时候,总希望能使用对象来进行抽象。

那么对于地图和地图包这两个相关的对象,我们能不能简化他们之间的区别呢?

待解决的问题:尽量是调用这两种对象的代码一致,也就是说很多场合不必区分到底是地图还是地图包。

思路:我们做一个抽象类,让地图类和地图包类继承它,这样类的很多方法的名称一样。

组合(Composite)模式示例:

<?php
  //抽象地图类
  abstract class abstractMap
  {
    //地图或地图包的名称
    public $name;

    //构造方法
    public function __construct($name)
    {
      $this->name = $name;
    }

    //地图或地图包的名称,地图对象没有子对象,所以用空函数,直接继承
    public function getChildren(){}

    //添加子对象,地图对象没有子对象,所以用空函数,直接继承
    public function addChild(abstractMap $child){}

    //显示地图或地图包的名称
    public function showMapName()
    {
      echo $this->name.”<br>”;
    }

    //显示子对象,地图对象没有子对象,所以用空函数,直接继承
    public function showChildren(){}
  }

  //地图类,继承抽象地图,这里面我们暂且使用抽象地图的方法
  class Map extends abstractMap
  {

  }

  //地图包类,继承抽象地图,这里面我们就需要重载抽象地图的方法
  class MapBag extends abstractMap
  {

    //子对象的集合
    public $childern;

    //添加子对象,强制用abstractMap对象,当然地图和地图包由于继承了abstractMap,所以也是abstractMap对象
    public function addChild(abstractMap $child)
    {
      $this->childern[] = $child;
    }

    //添加子对象
    public function function showChildren()
    {
      if (count($this->childern)>0)
      {
        foreach ($this->childern as $child)
        {
          //调用地图或包的名称
          $child->showMapName();
        }
      }
    }
  }

  //新建一个地图包对象,假设文件夹名字为Allied,这个大家可以看看星际的地图目录,真实存在的
  $map1 = new MapBag(‘Allied');

  //新建一个地图对象,假设文件名字为(2)Fire Walker(也是真实的)
  $map2 = new Map(‘(2)Fire Walker');

  //接下去可以看到组合模式的特点和用处。

  //假设后面的代码需要操作两个对象,而我们假设并不清楚这两个对象谁是地图,谁是地图包

  //给$map1添加一个它的子对象,是个地图,(4)The Gardens
  $map1->addChild(new Map(‘(4)The Gardens'));

  //展示它的子对象
  $map1->showChildren();

  //给$map2添加一个它的子对象,是个地图,(2)Fire Walker,这里不会报错,因为地图继承了一个空的添加方法
  $map2->addChild(new Map(‘(2)Fire Walker'));

  //展示它的子对象,也不会出错,因为地图继承了一个空的展示方法
  $map2->showChildren();

?>

用途总结:组合模式可以对容器和物体(这里的地图包和地图)统一处理,其他代码处理这些对象的时候,不必过于追究谁是容器,谁是物体。这里为了简化说明,没有深入探讨,其实组合模式常常用于和迭代模式结合,比如我们可以用统一的方法(就像这里的showChildren方法),获取地图包下所有的地图名(包括子目录)

实现总结:用一个基类实现一些容器和物体共用的方法,比如上面的abstractMap,然后让容器和物体类继承基类。由于各自的特性不同,在容器和物体类中重载相应的方法,比如addChild方法。这样对外就可以用统一的方法操作这两种对象。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
用PHP+java实现自动新闻滚动窗口
Oct 09 PHP
针对初学PHP者的疑难问答(1)
Oct 09 PHP
一些PHP写的小东西
Dec 06 PHP
MySQL数据源表结构图示
Jun 05 PHP
php中\r \r\n \t的区别示例介绍
Feb 08 PHP
PHP中使用glob函数实现一句话删除某个目录下的所有文件
Jul 22 PHP
PHP四种基本排序算法示例
Apr 09 PHP
php通过exif_read_data函数获取图片的exif信息
May 21 PHP
thinkphp中字符截取函数msubstr()用法分析
Jan 09 PHP
php数据库操作model类(使用__call方法)
Nov 16 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
Dec 20 PHP
使用Rancher在K8S上部署高性能PHP应用程序的教程
Jul 10 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
Mar 26 #PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
Mar 26 #PHP
Centos7安装swoole扩展操作示例
Mar 26 #PHP
PHP开发api接口安全验证操作实例详解
Mar 26 #PHP
PHP使用PhpSpreadsheet操作Excel实例详解
Mar 26 #PHP
php中加密解密DES类的简单使用方法示例
Mar 26 #PHP
TP5框架使用QueryList采集框架爬小说操作示例
Mar 26 #PHP
You might like
从零开始 教你如何搭建Discuz!4.1论坛
2006/07/07 PHP
浅析echo(),print(),print_r(),return之间的区别
2013/11/27 PHP
使用array_map简单搞定PHP删除文件、删除目录
2014/10/29 PHP
PHP中浮点数计算比较及取整不准确的解决方法
2015/01/09 PHP
php的4种常见运行方式
2015/03/20 PHP
帝国cms目录结构分享
2015/07/06 PHP
PHP操作MySQL的mysql_fetch_* 函数的常见用法教程
2015/12/25 PHP
php 数组随机取值的简单实例
2016/05/23 PHP
支付宝支付开发――当面付条码支付和扫码支付实例
2016/11/04 PHP
详解PHP中的 input属性(隐藏 只读 限制)
2017/08/14 PHP
在JavaScript中获取请求的URL参数
2010/12/22 Javascript
C#中TrimStart,TrimEnd,Trim在javascript上的实现
2011/01/17 Javascript
图片放大镜jquery.jqzoom.js使用实例附放大镜图标
2014/06/19 Javascript
fullpage.js全屏滚动插件使用实例
2016/09/06 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(三)
2016/09/14 Javascript
AngularJs ng-repeat 嵌套如何获取外层$index
2016/09/21 Javascript
D3.js实现雷达图的方法详解
2016/09/22 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
2017/01/24 Javascript
jQuery通过改变input的type属性实现密码显示隐藏切换功能
2017/02/08 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
2019/03/21 Javascript
vue实现菜单切换功能
2019/05/08 Javascript
layui动态绑定事件的方法
2019/09/20 Javascript
原生js实现二级联动菜单
2019/11/27 Javascript
微信小程序仿淘宝热搜词在搜索框中轮播功能
2020/01/21 Javascript
JavaScript中window和document用法详解
2020/07/28 Javascript
[01:03:03]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
详解pyenv下使用python matplotlib模块的问题解决
2018/11/29 Python
Python检测数据类型的方法总结
2019/05/20 Python
使用python接入微信聊天机器人
2020/03/31 Python
django 捕获异常和日志系统过程详解
2019/07/18 Python
Django1.11自带分页器paginator的使用方法
2019/10/31 Python
python 递归调用返回None的问题及解决方法
2020/03/16 Python
python实现横向拼接图片
2020/03/23 Python
早餐连锁店计划书
2014/01/08 职场文书
2019送给家人们的中秋节祝福语
2019/08/15 职场文书
pytorch显存一直变大的解决方案
2021/04/08 Python