Home >php教程 >PHP开发 >星际争霸之php迭代器模式

星际争霸之php迭代器模式

WBOY
WBOYOriginal
2016-06-07 17:23:041317browse

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

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

但问题出来了,由于每个任务的设定会有所不同,我们总希望任务的开发比较方便,而且容易修改(一旦发现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 
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn