php-迭代器模式
概述
? 迭代器模式:迭代器模式是遍历集合的成熟模式,迭代器模式的关键是将遍历集合的任务交给一个叫做迭代器的对象,它的工作时遍历并选择序列中的对象,而客户端程序员不必知道或关心该集合序列底层的结构。
我们这里还是以摩托车制造为例,出于对品控的考虑,我们现在需要对组装出来的摩托车进行批量质检。现规定每批对100台依次进行检测。这里就用到了迭代器模式
模式结构
IIterator - 抽象迭代器
ConcreteIterator - 具体迭代器
图例
代码实例
<?php
abstract class IIterator
{
public abstract function First();
public abstract function Next();
public abstract function IsDone();
public abstract function CurrentItem();
}
class ConcreteIterator extends IIterator
{
private $aggre;
private $current = 0;
public function __construct(array $_aggre)
{
$this->aggre = $_aggre;
}
public function First()
{
return $this->aggre[0];
}
public function Next()
{
$this->current++;
if($this->current<count($this->aggre))
{
return $this->aggre[$this->current];
}
return false;
}
public function IsDone()
{
return $this->current>=count($this->aggre)?true:false;
}
public function CurrentItem()
{
return $this->aggre[$this->current];
}
}
$motor = [];
for($i = 0; $i <= 99; $i++)
{
$key = $i+1;
$motor[$i] = "Motor_".$key;
}
$iterator= new ConcreteIterator($motor);
while(!$iterator->IsDone())
{
echo "{$iterator->CurrentItem()}:已经检测!<br/>";
$iterator->Next();
}
模式分析
迭代器有时又称光标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如list或vector)上遍访的接口,设计人员无需关心容器物件的内容,现在呢,各种语言实作Iterator的方式皆不尽同,有些面向对象语言像Java, C#, Python, Delphi都已将Iterator的特性内建语言当中,完美的跟语言整合,我们称之隐式迭代器(implicit iterator),但像是C++语言本身就没有Iterator的特色,但STL仍利用template实作了功能强大的iterator。
优缺点
迭代器模式优点 1.支持多种遍历方式。比如有序列表,我们根据需要提供正序遍历、倒序遍历两种迭代器。用户只需要得到我们的迭代器,就可以对集合执行遍历操作 2.简化了聚合类。由于引入了迭代器,原有的集合对象不需要自行遍历集合元素了 3.增加新的聚合类和迭代器类很方便,两个维度上可各自独立变化 4.为不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上操作 迭代器模式缺点 缺点就是迭代器模式将存储数据和遍历数据的职责分离增加新的集合对象时需要增加对应的迭代器类,类的个数成对增加,在一定程度上增加系统复杂度。
适用环境
1.访问一个聚合对象内容而无须暴露它的内部显示 2.需要为聚合对象提供多种遍历方式 3.为遍历不同的聚合结构提供一个统一的接口
|