php设计模式之迭代器模式实例分析【星际争霸游戏案例】


Posted in PHP onApril 07, 2020

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

星际的任务关一般会有这样的设定:一开始电脑的农民不采矿,如果战斗打响,或者玩家造出第一个兵,电脑的农民开始采矿。

我们自然会想到把电脑的农民放到一个数组,然后一旦玩家造兵,或者战斗打响,把这个数组循环,让里面的农民采矿。

但问题出来了,由于每个任务的设定会有所不同,我们总希望任务的开发比较方便,而且容易修改(一旦发现bug)。

何况有些任务不是农民采矿,而是电脑出兵攻击玩家。

那么过多的固定细节(用数组存放)以及依赖细节(对数组循环),将使得代码的关联性变得很高。

待解决的问题:把循环处理的事务变的抽象。

思路:关键是对农民的循环,用数组处理只是一种方式,我们考虑抽象的数组,而不是具体的数组。

迭代器(Iterator)模式示例:

<?php
  //聚集接口,意思是所有电脑的农民都聚集在这个类里面
  interface IAggregate
  {
    //让具体的聚集类实现的,获取使用的迭代器的方法
    public function createIterator();
  }

  //具体的聚集类
  class ConcreteAggregate implements IAggregate
  {
    //存放农民的数组,注意可以不用数组来处理,看完所有的代码就知道了
    public $workers;

    //增加元素的方法,这里元素就是农民
    public function addElement($element)
    {
      $this->workers[] = $element;
    }

    //获取元素的方法
    public function getAt($index)
    {
      return $this->workers[$index];
    }

    //获取元素的数量的方法
    public function getLength()
    {
      return count($this->workers);
    }

    //获取迭代器的方法
    public function createIterator()
    {
      return new ConcreteIterator($this);
    }
  }

  //迭代器接口,注意php5有个内置的接口叫Iterator,所以这里我们改成IIterator
  interface IIterator
  {
    //是否元素循环完毕
    public function hasNext();

    //返回下一个元素,并将指针加1
    public function next();
  }

  //具体的迭代器类
  class ConcreteIterator implements IIterator
  {
    //要迭代的集合
    public $collection;

    //指针
    public $index;

    //构造函数,确定迭代的集合,并将指针置零
    public function __construct($collection)
    {
      $this->collection = $collection;
      $this->index = 0;
    }

    //是否元素循环完毕
    public function hasNext()
    {
      if($this->index < $this->collection->getLength())
      {
        return true;
      }
      else
      {
        return false;
      }
    }

    //返回下一个元素,并将指针加1
    public function next()
    {
      $element = $this->collection->getAt($this->index);
      $this->index++;
      return $element;
    }
  }

  //初始化电脑的农民的聚集对象
  $farmerAggregate = new ConcreteAggregate();

  //添加农民,这里简单的用字符串表示
  $farmerAggregate->addElement('SVC1');
  $farmerAggregate->addElement('SVC2');

  //获取迭代器
  $iterator = $farmerAggregate->createIterator();

  //将农民聚集对象循环
  while ($iterator->hasNext())
  {
    //获取下一个农民
    $element = $iterator->next();
    //我们简单的输出
    echo $element;
  }
?>

用途总结:迭代器模式建立了类似数组的形式,从上面的代码可以看到,如果要修改循环的处理,或者修改被循环的集合,都不必修改其它相关的代码。

实现总结:需要一个管理聚集的类,比如上面的ConcreteAggregate。另外需要迭代器类,比如上面的ConcreteIterator。然后把所有的操作,比如添加元素,获取下一个元素,指针之类的数组方面的操作抽象出来,这样其它的代码只要使用方法,比如getLength(),而不是细节化的count()函数,这样即使不用数组存放农民,也不需要改动聚集类以外的代码。

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

PHP 相关文章推荐
在线竞拍系统的PHP实现框架(二)
Oct 09 PHP
落伍首发 php+mysql 采用ajax技术的 省 市 地 3级联动无刷新菜单 源码
Dec 16 PHP
理解PHP5中static和const关键字的区别
Mar 19 PHP
php array的学习笔记
May 16 PHP
基于php上传图片重命名的6种解决方法的详细介绍
Apr 28 PHP
PHP session_start()问题解疑(详细介绍)
Jul 05 PHP
ThinkPHP模板判断输出Defined标签用法详解
Jun 30 PHP
PHP中执行cmd命令的方法
Oct 11 PHP
PHP MPDF中文乱码的解决方式
Dec 08 PHP
PHP编写登录验证码功能 附调用方法
May 19 PHP
php微信公众号开发之校园图书馆
Oct 20 PHP
php7下的filesize函数
Sep 30 PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
Apr 06 #PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
Apr 06 #PHP
Laravel5.5+ 使用API Resources快速输出自定义JSON方法详解
Apr 06 #PHP
Laravel 5+ .env环境配置文件详解
Apr 06 #PHP
Laravel5.3+框架定义API路径取消CSRF保护方法详解
Apr 06 #PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
Apr 06 #PHP
使用git迁移Laravel项目至新开发环境的步骤详解
Apr 06 #PHP
You might like
坏狼的PHP学习教程之第2天
2008/06/15 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
jQuery select的操作实现代码
2009/05/06 Javascript
JavaScript 基于原型的对象(创建、调用)
2009/10/16 Javascript
服务器端的JavaScript脚本 Node.js 使用入门
2012/03/07 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
2014/09/22 Javascript
javascript实现数组中的内容随机输出
2015/08/11 Javascript
js实现继承的5种方式
2015/12/01 Javascript
JavaScript几种数组去掉重复值的方法推荐
2016/04/12 Javascript
jquery的checkbox,radio,select等方法小结
2016/08/30 Javascript
Vue.js每天必学之过渡与动画
2016/09/06 Javascript
JavaScript动态数量的文件上传控件
2016/11/18 Javascript
详解Node.js中path模块的resolve()和join()方法的区别
2018/10/29 Javascript
vue router总结 $router和$route及router与 router与route区别
2019/07/05 Javascript
js的新生代垃圾回收知识点总结
2019/08/22 Javascript
python实现list元素按关键字相加减的方法示例
2017/06/09 Python
使用pygame模块编写贪吃蛇的实例讲解
2018/02/05 Python
python脚本监控Tomcat服务器的方法
2018/07/06 Python
python使用多进程的实例详解
2018/09/19 Python
python实战串口助手_解决8串口多个发送的问题
2019/06/12 Python
Python3与fastdfs分布式文件系统如何实现交互
2020/06/23 Python
使用CSS3设计地图上的雷达定位提示效果
2016/04/05 HTML / CSS
html5中localStorage本地存储的简单使用
2017/06/16 HTML / CSS
Lookfantastic瑞典:英国知名美妆购物网站
2018/04/06 全球购物
Napapijri西班牙在线商店:夹克、外套、运动衫等
2020/11/05 全球购物
写一个方法1000的阶乘
2012/11/21 面试题
软件测试工程师结构化面试题库
2016/11/23 面试题
公务员个人自我评价分享
2013/11/06 职场文书
关于迟到的检讨书
2014/01/26 职场文书
运动会入场词200字
2014/02/15 职场文书
医院院务公开实施方案
2014/05/03 职场文书
初婚初育证明范本
2014/11/24 职场文书
社区活动总结
2015/02/04 职场文书
2015年煤矿安全工作总结
2015/05/23 职场文书
2015年高中班级工作总结
2015/07/21 职场文书
2016年国庆节新闻稿范文
2015/11/25 职场文书