若转载教程,请注明出自SW-X框架官方文档1
<?php/*** 设计模式之迭代器模式* 场景:指针读取 - 先进先出,后进后出* 小黄牛*/header("Content-type: text/html; charset=utf-8");/*** 接口 迭代器*/interface IIterator{public function First(); // 首元素public function Next(); // 下一个元素public function IsDone(); // 是否已结束public function CurrentItem(); // 当前元素public function CurrentIdx(); // 当前指针}/*** 抽象 容器*/abstract class Aggregate{protected $IIter; // 迭代器的实例/*** 选择容器对应的迭代器*/public function __construct($New){$this->IIter = $New;}/*** 将容器的this传给 迭代器,并返回迭代器的当前实例*/abstract public function CreateIterator();}/*** 创建一个 - 具体容器*/class MyAggregate extends Aggregate{public $Items = array(); // 数据存储内容# 容器的迭代器public function CreateIterator(){return $this->IIter->GetAg($this);}# 获得指定容器内容public function GetItem($idx){return isset($this->Items[$idx]) ? $this->Items[$idx] : null;}# 修改容器内容public function SetItem($idx,$val){$this->Items[$idx] = $val;}# 获得容器内容长度public function GetCount(){return count($this->Items);}}/*** 创建一个 - 具体迭代器*/class MineIterator implements IIterator{//容器【聚集对象】private $aggregate; // 容器的实例private $current = 0; // 容器内的数据长度# 为迭代器注入容器public function GetAg($aggregate){$this->aggregate = $aggregate;return $this;}# 获取首元素public function First(){return $this->aggregate->GetItem(0);}# 下一个元素内容public function Next(){$this->current++;# 在这一步你也可以设置成指针向下,并获取下一个元素内容}# 是否已结束 - 已无内容public function IsDone() {return ($this->current >= $this->aggregate->GetCount()) ? true : false;}# 获取当前元素public function CurrentItem(){return $this->aggregate->GetItem($this->current);}# 获取当前元素长度public function CurrentIdx() {return $this->current;}}# 创建一个容器$myAggregate = new MyAggregate(new MineIterator());# 向容器中添加元素$myAggregate->SetItem(0,'小黄牛');$myAggregate->SetItem(1,'小黄狗');$myAggregate->SetItem(2,'小黄猪');# 迭代器注入容器内容$iterator = $myAggregate->CreateIterator();# 还有内容,就一直遍历while(!$iterator->IsDone()) {$idx = $iterator->CurrentIdx(); // 获得元素当前位置长度$item = $iterator->CurrentItem(); // 获取当前元素内容echo "当前位置:{$idx},值:{$item}<br/>";$iterator->Next(); // 将指针指向下一个元素,否则将会出现死循环}
浏览器输出
- 当前位置:0,值:小黄牛
- 当前位置:1,值:小黄狗
- 当前位置:2,值:小黄猪
迭代器模式
Iterator(迭代器):迭代器定义访问和遍历元素的接口ConcreteIterator(具体迭代器):具体迭代器实现迭代器接口,对该聚合遍历时跟踪当前位置Aggregate (聚合):聚合定义创建相应迭代器对象的接口(可选)ConcreteAggregate(具体聚合):具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例(可选)
使用场景
1.访问一个聚合对象的内容而无需暴露它的内部表示2.支持对聚合对象的多种遍历3.为遍历不同的聚合结构提供一个统一的接口4.队列或按照指针循环读取的情况下
