当前位置:首页 > PHP教程 > php面向对象 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2022-02-25 11:50:34 浏览: 评论:0 

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

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

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

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

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

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

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

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

迭代器(Iterator)模式示例:

  1. <?php 
  2.   //聚集接口,意思是所有电脑的农民都聚集在这个类里面 
  3.   interface IAggregate 
  4.   { 
  5.     //让具体的聚集类实现的,获取使用的迭代器的方法 
  6.     public function createIterator(); 
  7.   } 
  8.  
  9.   //具体的聚集类 
  10.   class ConcreteAggregate implements IAggregate 
  11.   { 
  12.     //存放农民的数组,注意可以不用数组来处理,看完所有的代码就知道了 
  13.     public $workers
  14.  
  15.     //增加元素的方法,这里元素就是农民 
  16.     public function addElement($element
  17.     { 
  18.       $this->workers[] = $element
  19.     } 
  20.  
  21.     //获取元素的方法 
  22.     public function getAt($index
  23.     { 
  24.       return $this->workers[$index]; 
  25.     } 
  26.  
  27.     //获取元素的数量的方法 
  28.     public function getLength() 
  29.     { 
  30.       return count($this->workers); 
  31.     } 
  32.  
  33.     //获取迭代器的方法 
  34.     public function createIterator() 
  35.     { 
  36.       return new ConcreteIterator($this); 
  37.     } 
  38.   } 
  39.  
  40.   //迭代器接口,注意php5有个内置的接口叫Iterator,所以这里我们改成IIterator 
  41.   interface IIterator 
  42.   { 
  43.     //是否元素循环完毕 
  44.     public function hasNext(); 
  45.  
  46.     //返回下一个元素,并将指针加1 
  47.     public function next(); 
  48.   } 
  49.  
  50.   //具体的迭代器类 
  51.   class ConcreteIterator implements IIterator 
  52.   { 
  53.     //要迭代的集合 
  54.     public $collection
  55.  
  56.     //指针 
  57.     public $index
  58.  
  59.     //构造函数,确定迭代的集合,并将指针置零 
  60.     public function __construct($collection
  61.     { 
  62.       $this->collection = $collection
  63.       $this->index = 0; 
  64.     } 
  65.  
  66.     //是否元素循环完毕 
  67.     public function hasNext() 
  68.     { 
  69.       if($this->index < $this->collection->getLength()) 
  70.       { 
  71.         return true; 
  72.       } 
  73.       else 
  74.       { 
  75.         return false; 
  76.       } 
  77.     } 
  78.  
  79.     //返回下一个元素,并将指针加1 
  80.     public function next() 
  81.     { 
  82.       $element = $this->collection->getAt($this->index); 
  83.       $this->index++; 
  84.       return $element
  85.     } 
  86.   } 
  87.  
  88.   //初始化电脑的农民的聚集对象 
  89.   $farmerAggregate = new ConcreteAggregate(); 
  90.  
  91.   //添加农民,这里简单的用字符串表示 
  92.   $farmerAggregate->addElement('SVC1'); 
  93.   $farmerAggregate->addElement('SVC2'); 
  94.  
  95.   //获取迭代器 
  96.   $iterator = $farmerAggregate->createIterator(); 
  97.  
  98.   //将农民聚集对象循环 
  99.   while ($iterator->hasNext()) 
  100.   { 
  101.     //获取下一个农民 
  102.     $element = $iterator->next(); 
  103.     //我们简单的输出 
  104.     echo $element
  105.   } 
  106. ?> 

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

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

Tags: php迭代器模式 php星际争霸游戏

分享到: