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 相关文章推荐
基于mysql的论坛(1)
Oct 09 PHP
AJAX for PHP简单表数据查询实例
Jan 02 PHP
php+dojo 的数据库保存拖动布局的一个方法dojo 这里下载
Mar 07 PHP
Mysql数据库操作类( 1127版,提供源码下载 )
Dec 02 PHP
PHP使用GIFEncoder类处理gif图片实例
Jul 01 PHP
作为程序员必知的16个最佳PHP库
Dec 09 PHP
微信开发之网页授权获取用户信息(二)
Jan 08 PHP
zend framework中使用memcache的方法
Mar 04 PHP
PHP函数shuffle()取数组若干个随机元素的方法分析
Apr 02 PHP
PHP小程序支付功能完整版【基于thinkPHP】
Mar 26 PHP
PHP数据对象映射模式实例分析
Mar 29 PHP
laravel异步监控定时调度器实例详解
Jun 21 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
php 各种应用乱码问题的解决方法
2010/05/09 PHP
基于php冒泡排序算法的深入理解
2013/06/09 PHP
php获取bing每日壁纸示例分享
2014/02/25 PHP
PHP、Java des加密解密实例
2015/04/27 PHP
PHP模板引擎smarty详细介绍
2015/05/26 PHP
PHP中多线程的两个实现方法
2016/10/14 PHP
PHP排序算法之归并排序(Merging Sort)实例详解
2018/04/21 PHP
javascript实现的listview效果
2007/04/28 Javascript
JQuery设置文本框和密码框得到焦点时的样式
2013/08/30 Javascript
js Array操作的最简短最容易理解方法
2013/12/09 Javascript
javascript实现ecshop搜索框键盘上下键切换控制
2015/03/18 Javascript
javascript实现控制文字大中小显示
2015/04/28 Javascript
jQuery实现类似老虎机滚动抽奖效果
2015/08/06 Javascript
JavaScript日期对象(Date)基本用法示例
2017/01/18 Javascript
js获取ip和地区
2017/03/10 Javascript
JS排序之快速排序详解
2017/04/08 Javascript
IScroll5实现下拉刷新上拉加载的功能实例
2017/08/11 Javascript
element-ui 上传图片后清空图片显示的实例
2018/09/04 Javascript
详解ES6系列之私有变量的实现
2018/11/21 Javascript
vue设计一个倒计时秒杀的组件详解
2019/04/06 Javascript
python实现带声音的摩斯码翻译实现方法
2015/05/20 Python
教你用Python脚本快速为iOS10生成图标和截屏
2016/09/22 Python
基于Python的接口测试框架实例
2016/11/04 Python
python使用PyCharm进行远程开发和调试
2017/11/02 Python
使用Python读取安卓手机的屏幕分辨率方法
2018/03/31 Python
python最小生成树kruskal与prim算法详解
2019/01/17 Python
python mac下安装虚拟环境的图文教程
2019/04/12 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
2019/06/03 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
2019/08/05 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
2020/07/14 Python
汽车维修与检测专业应届生求职信
2013/11/12 职场文书
语文教育专业推荐信范文
2013/11/25 职场文书
毕业研究生的自我鉴定
2013/11/30 职场文书
高二历史教学反思
2014/01/25 职场文书
颁奖晚会主持词
2014/03/25 职场文书
Vue3实现简易音乐播放器组件
2022/08/14 Vue.js