行为型设计模式 - 迭代器 Iterator
作者:菜皮日记
- 2023-09-08 北京
本文字数:1204 字
阅读完需:约 4 分钟
简介
提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。
角色
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:FirstSecondThird
Reverse traversal:ThirdSecondFirst
复制代码
划线
评论
复制
发布于: 刚刚阅读数: 4
菜皮日记
关注
全干程序员 2018-08-08 加入
还未添加个人简介










评论