概述
迭代器模式是一种行为型设计模式,它提供一种遍历聚合对象中各个元素的方法,而无需暴露聚合对象的内部表示。通过使用迭代器模式,可以在不暴露聚合对象内部结构的情况下,让客户端代码能够逐个访问聚合对象中的元素。
适用场景
迭代器模式适用于以下情况:
- 当你需要遍历一个聚合对象的元素,但又不希望暴露聚合对象的内部结构给客户端代码时。
- 当你希望提供多种遍历方式,而不仅限于顺序遍历时。
- 当你希望能够让聚合对象的表示和遍历算法独立变化时。
结构
迭代器模式由以下组件组成:
- 迭代器接口(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方法来创建具体迭代器对象,并使用迭代器逐个访问聚合对象中的元素。