迭代器模式(Iterator Pattern)是设计模式中的一种,它提供了一种顺序访问一个聚合对象(如列表、集合等)中各个元素的方法,而又不需要暴露该对象的内部表示。使用迭代器模式,可以方便地遍历一个聚合对象的所有元素,而不需要了解该对象的底层结构。
迭代器模式主要包含以下角色:
- 迭代器接口(Iterator):定义访问和遍历元素的接口,通常包含 hasNext() 和 next() 等方法。
 - 具体迭代器(Concrete Iterator):实现迭代器接口,完成对聚合对象的遍历,并记录当前遍历的位置。
 - 聚合接口(Aggregate):定义创建相应迭代器对象的接口。
 - 具体聚合(Concrete Aggregate):实现创建相应迭代器的接口,返回一个具体迭代器实例。
 
以下是使用 Java 实现迭代器模式的示例:
        java复制代码
|---|----------------------------------------------------------------|
|   | // 迭代器接口                                                     |
|   | public interface Iterator<T> {                               |
|   | boolean hasNext();                                           |
|   | T next();                                                    |
|   | }                                                            |
|   |                                                                |
|   | // 聚合接口                                                      |
|   | public interface Aggregate<T> {                              |
|   | Iterator<T> createIterator();                                |
|   | }                                                            |
|   |                                                                |
|   | // 具体聚合                                                      |
|   | public class ConcreteAggregate<T> implements Aggregate<T> {  |
|   | private List<T> list = new ArrayList<>();                    |
|   |                                                                |
|   | public void add(T item) {                                    |
|   | list.add(item);                                              |
|   | }                                                            |
|   |                                                                |
|   | public void remove(T item) {                                 |
|   | list.remove(item);                                           |
|   | }                                                            |
|   |                                                                |
|   | @Override                                                    |
|   | public Iterator<T> createIterator() {                        |
|   | return new ConcreteIterator<>(list);                         |
|   | }                                                            |
|   | }                                                            |
|   |                                                                |
|   | // 具体迭代器                                                     |
|   | public class ConcreteIterator<T> implements Iterator<T> {    |
|   | private List<T> list;                                        |
|   | private int index = 0;                                       |
|   |                                                                |
|   | public ConcreteIterator(List<T> list) {                      |
|   | this.list = list;                                            |
|   | }                                                            |
|   |                                                                |
|   | @Override                                                    |
|   | public boolean hasNext() {                                   |
|   | return index < list.size();                                  |
|   | }                                                            |
|   |                                                                |
|   | @Override                                                    |
|   | public T next() {                                            |
|   | if (hasNext()) {                                             |
|   | return list.get(index++);                                    |
|   | }                                                            |
|   | return null;                                                 |
|   | }                                                            |
|   | }                                                            |
|   |                                                                |
|   | // 客户端代码                                                     |
|   | public class Client {                                        |
|   | public static void main(String[] args) {                     |
|   | Aggregate<String> aggregate = new ConcreteAggregate<>();     |
|   | aggregate.add("Item 1");                                     |
|   | aggregate.add("Item 2");                                     |
|   | aggregate.add("Item 3");                                     |
|   |                                                                |
|   | Iterator<String> iterator = aggregate.createIterator();      |
|   | while (iterator.hasNext()) {                                 |
|   | System.out.println(iterator.next());                         |
|   | }                                                            |
|   | }                                                            |
|   | }                                                            |
在这个示例中,我们首先定义了一个迭代器接口 Iterator,它包含 hasNext() 和 next() 方法。然后,我们定义了一个聚合接口 Aggregate,它包含 createIterator() 方法,用于创建相应聚合对象的迭代器。
接着,我们创建了一个具体聚合类 ConcreteAggregate,它实现了 Aggregate 接口,并包含一个内部列表来存储元素。ConcreteAggregate 的 createIterator() 方法返回一个具体迭代器实例,用于遍历聚合对象中的元素。
最后,我们创建了一个具体迭代器类 ConcreteIterator,它实现了 Iterator 接口,并使用一个内部索引来记录当前遍历的位置。hasNext() 方法检查是否还有更多元素,next() 方法返回下一个元素,并将索引递增。
在客户端代码中,我们创建了一个具体聚合对象,向其中添加了一些元素,并使用聚合对象的 createIterator() 方法创建了一个迭代器。然后,我们使用迭代器的 hasNext() 和 next() 方法遍历了聚合对象中的所有元素。