简介
提供一种办法程序拜访一个聚合对象中的各个元素,而又不须要裸露该对象的外部示意。
角色
- 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:FirstSecondThirdReverse traversal:ThirdSecondFirst
本文由mdnice多平台公布