写点什么

行为型设计模式 - 迭代器 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
复制代码


用户头像

菜皮日记

关注

全干程序员 2018-08-08 加入

还未添加个人简介

评论

发布
暂无评论
行为型设计模式-迭代器 Iterator_设计模式_菜皮日记_InfoQ写作社区