简介
提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。
角色
- Iterator抽象迭代器
- Collection抽象集合
- ConcreteIterator具体迭代器
- ConcreteCollection具体集合
类图
如图,Iterator和IterableCollection定义了操作接口,ConcreteIterator实现类持有ConcreteCollection的引用,默默实现迭代的逻辑。
代码
use Iterator;
class AlphabeticalOrderIterator implements \Iterator
{
private $collection;
private $position = 0;
private $reverse = false;
public function __construct($collection, $reverse = false)
{
$this->collection = $collection;
$this->reverse = $reverse;
}
public function rewind()
{
$this->position = $this->reverse ?
count($this->collection->getItems()) - 1 : 0;
}
public function current()
{
return $this->collection->getItems()[$this->position];
}
public function key()
{
return $this->position;
}
public function next()
{
$this->position = $this->position + ($this->reverse ? -1 : 1);
}
public function valid()
{
return isset($this->collection->getItems()[$this->position]);
}
}
class WordsCollection implements \IteratorAggregate
{
private $items = [];
public function getItems()
{
return $this->items;
}
public function addItem($item)
{
$this->items[] = $item;
}
public function getIterator(): Iterator
{
return new AlphabeticalOrderIterator($this);
}
public function getReverseIterator(): Iterator
{
return new AlphabeticalOrderIterator($this, true);
}
}
$collection = new WordsCollection();
$collection->addItem("First");
$collection->addItem("Second");
$collection->addItem("Third");
echo "Straight traversal:\n";
foreach ($collection->getIterator() as $item) {
echo $item . "\n";
}
echo "\n";
echo "Reverse traversal:\n";
foreach ($collection->getReverseIterator() as $item) {
echo $item . "\n";
}
output:
Straight traversal:
First
Second
Third
Reverse traversal:
Third
Second
First
Top comments (0)