迭代器模式

迭代器是一种行为设计模式让你能在不暴露复杂数据结构内部细节的情况下遍历其中所有的元素

在迭代器的帮助下客户端可以用一个迭代器接口以相似的方式遍历不同集合中的元素

迭代器模式(Iterator Pattern)是一种设计模式,它属于行为型模式的范畴。迭代器模式提供了一种方法来顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示。迭代器模式将集合的遍历过程封装在一个独立的迭代器对象中,这样你可以在不修改集合代码的前提下,更换或增加新的遍历方式。

迭代器模式通常包含两个主要的组件:

1. 迭代器(Iterator):这是定义访问和遍历元素的接口,通常包含 hasNext()(判断是否有下一个元素)、`next()`(返回下一个元素)和 remove()(从集合中移除当前元素)等方法。

2. 具体迭代器(Concrete Iterator):实现了迭代器接口,生成而迭代器的具体实现,包含了遍历聚合对象的逻辑。

3. 聚合对象(Aggregate):这是包含了一系列元素的集合对象,它通常有一个创建相应具体迭代器对象的方法。

4. 具体聚合对象(Concrete Aggregate):实现了聚合对象接口的具体类,生成迭代器的一个实例。

下面是一个简单的 Java 代码示例来演示迭代器模式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128

// 迭代器接口

interface Iterator {

boolean hasNext();

Object next();

}

// 具体迭代器

class ConcreteIterator implements Iterator {

private ConcreteAggregate aggregate;

private int position = 0;

public ConcreteIterator(ConcreteAggregate aggregate) {

this.aggregate = aggregate;

}

@Override

public boolean hasNext() {

return position < aggregate.size();

}

@Override

public Object next() {

if (hasNext()) {

return aggregate.get(position++);

}

return null;

}

}

// 聚合对象接口

interface Aggregate {

Iterator createIterator();

}

// 具体聚合对象

class ConcreteAggregate implements Aggregate {

private Object[] items;

private int size = 0;

public ConcreteAggregate(int capacity) {

items = new Object[capacity];

}

public void add(Object item) {

if (size < items.length) {

items[size++] = item;

}

}

public Object get(int index) {

return items[index];

}

public int size() {

return size;

}

@Override

public Iterator createIterator() {

return new ConcreteIterator(this);

}

}

// 客户端代码

public class IteratorPatternDemo {

public static void main(String[] args) {

ConcreteAggregate aggregate = new ConcreteAggregate(10);

aggregate.add("Item 1");

aggregate.add("Item 2");

aggregate.add("Item 3");

Iterator iterator = aggregate.createIterator();

while (iterator.hasNext()) {

System.out.println(iterator.next());

}

}

}

在这个示例中,`ConcreteAggregate` 是一个具体聚合对象,它维护了一个对象数组,并提供了 createIterator() 方法来创建一个对应的迭代器。`ConcreteIterator` 是具体迭代器,它实现了 Iterator 接口,并包含了遍历聚合对象的逻辑。客户端代码通过调用 createIterator() 方法来获取迭代器,并使用它来遍历聚合对象中的所有元素。