概述
迭代器模式是一种行为型设计模式,它提供一种遍历聚合对象中各个元素的方法,而无需暴露聚合对象的内部表示。通过使用迭代器模式,可以在不暴露聚合对象内部结构的情况下,让客户端代码能够逐个访问聚合对象中的元素。
适用场景
迭代器模式适用于以下情况:
- 当你需要遍历一个聚合对象的元素,但又不希望暴露聚合对象的内部结构给客户端代码时。
- 当你希望提供多种遍历方式,而不仅限于顺序遍历时。
- 当你希望能够让聚合对象的表示和遍历算法独立变化时。
结构
迭代器模式由以下组件组成:
- 迭代器接口(Iterator):迭代器接口定义了遍历聚合对象元素的方法。
- 具体迭代器(ConcreteIterator):具体迭代器实现了迭代器接口,提供对聚合对象的顺序遍历。
- 聚合对象接口(Aggregate):聚合对象接口定义了创建具体迭代器对象的方法。
- 具体聚合对象(ConcreteAggregate):具体聚合对象实现了聚合对象接口,创建相应的具体迭代器对象。
示例
<?php
// 迭代器接口
interface Iterator
{
public function hasNext();
public function next();
}
// 具体迭代器
class ConcreteIterator implements Iterator
{
private $collection;
private $position = 0;
public function __construct($collection)
{
$this->collection = $collection;
}
public function hasNext()
{
return $this->position < count($this->collection);
}
public function next()
{
$item = $this->collection[$this->position];
$this->position++;
return $item;
}
}
// 聚合对象接口
interface Aggregate
{
public function createIterator();
}
// 具体聚合对象
class ConcreteAggregate implements Aggregate
{
private $collection = [];
public function addItem($item)
{
$this->collection[] = $item;
}
public function createIterator()
{
return new ConcreteIterator($this->collection);
}
}
// 客户端代码
$aggregate = new ConcreteAggregate();
$aggregate->addItem("Item 1");
$aggregate->addItem("Item 2");
$aggregate->addItem("Item 3");
$iterator = $aggregate->createIterator();
while ($iterator->hasNext()) {
echo $iterator->next() . PHP_EOL;
}
在上面的示例中,我们给出了一个迭代器模式的示例实现。其中,我们定义了迭代器接口(Iterator
)和具体迭代器(ConcreteIterator
)的实现。接着,我们定义了聚合对象接口(Aggregate
)和具体聚合对象(ConcreteAggregate
)的实现。最后,我们创建了一个具体聚合对象并添加了一些元素,然后通过调用聚合对象的createIterator
方法来创建具体迭代器对象,并使用迭代器逐个访问聚合对象中的元素。