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中的MVC模式运用技巧
May 03 PHP
php中的观察者模式
Mar 24 PHP
PHP删除目录及目录下所有文件的方法详解
Jun 06 PHP
解析php中获取url与物理路径的总结
Jun 21 PHP
用php简单实现加减乘除计算器
Jan 06 PHP
浅析ThinkPHP的模板输出功能
Jul 01 PHP
mantis安装、配置和使用中的问题小结
Jul 14 PHP
php字符串比较函数用法小结(strcmp,strcasecmp,strnatcmp及strnatcasecmp)
Jul 18 PHP
PHP目录操作实例总结
Sep 27 PHP
PHP实现求两个字符串最长公共子串的方法示例
Nov 17 PHP
PHP简单实现记录网站访问量功能示例
Jun 06 PHP
php使用event扩展的io复用测试的示例
Oct 20 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
短波收音机简介
2021/03/01 无线电
php高清晰度无损图片压缩功能的实现代码
2018/12/09 PHP
判断页面是关闭还是刷新的js代码
2007/01/28 Javascript
jquery 插件学习(三)
2012/08/06 Javascript
JS函数实现动态添加CSS样式表文件
2012/12/15 Javascript
Javascript 中 null、NaN和undefined的区别总结
2013/04/10 Javascript
在firefox和Chrome下关闭浏览器窗口无效的解决方法
2014/01/16 Javascript
jQuery中click事件的定义和用法
2014/12/20 Javascript
Angular的Bootstrap(引导)和Compiler(编译)机制
2016/06/20 Javascript
JS判断输入的字符串是否是数字的方法(正则表达式)
2016/11/29 Javascript
webpack独立打包和缓存处理详解
2017/04/03 Javascript
vue两个组件间值的传递或修改方式
2018/07/04 Javascript
Postman如何实现参数化执行及断言处理
2020/07/28 Javascript
详解Vue的mixin策略
2020/11/19 Vue.js
[04:26]2014DOTA2西雅图国际邀请赛 总决赛TOPPLAY
2014/07/22 DOTA
[01:00:17]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第二场 1月25日
2021/03/11 DOTA
对于Python中线程问题的简单讲解
2015/04/03 Python
python使用socket远程连接错误处理方法
2015/04/29 Python
python中list列表的高级函数
2016/05/17 Python
Python中import导入上一级目录模块及循环import问题的解决
2016/06/04 Python
Python随机生成均匀分布在三角形内或者任意多边形内的点
2017/12/14 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
2018/11/06 Python
Django处理多用户类型的方法介绍
2019/05/18 Python
python图片剪裁代码(图片按四个点坐标剪裁)
2020/03/10 Python
Python Json数据文件操作原理解析
2020/05/09 Python
Android Q之气泡弹窗的实现示例
2020/06/23 Python
flask开启多线程的具体方法
2020/08/02 Python
10行Python代码实现Web自动化管控的示例代码
2020/08/14 Python
python使用yaml 管理selenium元素的示例
2020/12/01 Python
Python入门基础之数字字符串与列表
2021/02/01 Python
浅析HTML5中header标签的用法
2016/06/24 HTML / CSS
文秘专业自荐信
2013/10/14 职场文书
讲党性心得体会
2014/09/03 职场文书
处级干部反四风个人对照检查材料思想汇报
2014/09/27 职场文书
2014年班组建设工作总结
2014/12/01 职场文书
2014年终工作总结范本
2014/12/15 职场文书