定義
提供一種方法來訪問聚合物件,而不用暴露這個物件的內部表示。
設計的原則和思想
- 解耦使用者和集合類物件。
- 不變部分是迭代器,變化部分是集合物件。
- 核心思想是讓物件能像陣列一樣能遍歷。
一句話概括設計模式
遍歷物件。
結構中包含的角色
- Iterator(抽象迭代器)
- ConcreteIterator(具體迭代器)
- IteratorAggregate(抽象聚合類)
- ConcreteIteratorAggregate(具體聚合類)
最小可表達程式碼
abstract class AbstractIterator implements Iterator
{
private $position = 0;
private $objects = [];
public function __construct(array $objects)
{
$this->position = 0;
$this->objects = $objects;
}
public function current()
{
return $this->objects[$this->position];
}
public function next()
{
++$this->position;
}
public function key()
{
return $this->position;
}
public function valid()
{
return isset($this->objects[$this->position]);
}
public function rewind()
{
$this->position = 0;
}
}
class ConcreteIterator extends AbstractIterator{}
class ConcreteIteratorAggregate implements IteratorAggregate
{
private $objects;
public function __construct(array $objects)
{
$this->objects = $objects;
}
public function getIterator()
{
return new ConcreteIterator($this->objects);
}
}
$objects = ['張3', '李4'];
$aggregate = new ConcreteIteratorAggregate($objects);
foreach ($aggregate->getIterator() as $key => $value) {
var_dump($key, $value);
}
優點
- 支援遍歷一個聚合物件。
- 在同一個聚合上可以有多個遍歷。
- 增加新的聚合類和迭代器類都很方便,無須修改原有程式碼。
- 可以暫停遍歷並在需要時繼續。
缺點
- 增加新的聚合類需要對應增加新的迭代器類,類的個數成對增加,這在一定程度上增加了系統的複雜性。
- 迭代器比直接遍歷的效率低。
- 抽象迭代器的設計難度較大,需要充分考慮到系統將來的擴充套件.
何時使用
- 為一個聚合物件提供多種遍歷方式(訪問集合元素的方法)而無須暴露它的內部表示。
- 如果你希望程式碼能夠遍歷不同的甚至是無法預知的資料結構, 可以使用迭代器模式。
實際應用場景
- Laravel的Collection類
本作品採用《CC 協議》,轉載必須註明作者和本文連結