迭代器模式
迭代器模式最重要的作用:迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该方法中的内部表示。对于集合内部结果常常变化各异,我们不想暴露其内部结构的话,但又想让客户代码透明底访问其中的元素,这种情况下我们可以使用迭代器模式。
迭代器就是把不同的数据结构 "相同功能 "的函数装到一个名字相同的函数里,这样的话你在写算法的时候就可以不管你要操作的数据结构的逻辑结构了。 比如不管是链表,数组还是别的什么,统一都用迭代器进行访问的话可能都是 Next()表示下一个元素 Pre()表示上一个元素等等 。 其实意思就是,不管你用的是链表,2叉树、3叉树、N叉树,还是向量。 迭代器都可以让你从first开始,使用next,到达last,而且一个不漏滴都走一遍。 你不必知道在next的时候,迭代器是怎样从当前节点跳到下一个节点的。 就和猴子一样,你不必知道猴子是怎样从这个树的节点跳到那个树的!总之,猴子可以把树的所有节点跳一边(再次强调:一个不漏) 迭代器是: 无论你用的是什么结构(链表也好、数组也好、数也好、图也好、hash表也好),总之, 你可以不关心任何细节遍历细节,(下面看好了) 从一个起点(begin)触发到达,到达终点(end),并且保证每个节点都能走到且只走一次。
<?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);//具体的迭代器类,在下面有写出来 这里的$this很重要, } } /*迭代器接口*/ interface IIterator //注意php5有个内置的接口叫Iterator,所以这里我们改成IIterator { public function hasNext();//是否元素循环完毕 public function next();//返回下一个元素,并将指针加1 } /*具体的迭代器类*/ 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();//获取迭代器ConcreteIterator //将农民聚集对象循环 while ($iterator->hasNext()) { $element = $iterator->next();//获取下一个农民 echo $element;//我们简单的输出 }