Earth Guardian

You are not LATE!You are not EARLY!

0%

设计模式--行为型:迭代器模式

迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露对象内部表示

迭代器模式

迭代器模式 Iterator[ɪtə'reɪtə] Pattern:又称为游标 Cursor 模式,是非常古老的设计模式,主要用于对容器的遍历访问,当前高级面向对象语言基本上默认包含这个模式。

类图结构

0064-Iterator-uml-classdiag.png

结构解析

  • Iterator
    接口,定义迭代器的基本方法。
  • ConcreteIterator
    实现类,实现迭代器的方法。
  • Aggregate
    抽象类,容器类,存储数据并创建迭代器。
  • ConcreteAggregate
    实现类,容器的各个方法的实现,并完成具体迭代器的创建。
  • Client
    客户端。

ConcreteIteratorConcreteAggregate 耦合性很高。ConcreteAggregate 创建了 ConcreteIterator 实例,而 ConcreteIterator 持有 ConcreteAggregate 的引用,用于遍历容器中的数据。
迭代器模式结构图看起来很臃肿,使用起来并不方便,而分开的目的参考单一职责原理,Aggregate 负责容器中数据元素的维护,而 Iterator 负责遍历操作。

示例

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
// 1. Iterator
public interface Iterator {
Object next();
boolean hasNext();
}

// 2. Aggregate
public abstract class Aggregate {
public abstract Iterator createIterator();
public abstract void add(String string);
public abstract void remove(String string);
public abstract String get(int index);
public abstract int size();
}

// 3. ConcreteIterator
public class ConcreteIterator implements Iterator{
private Aggregate aggregate;
private int index = 0;

public ConcreteIterator(Aggregate aggregate){
this.aggregate = aggregate;
}

@Override
public String next() {
String next = null;
if (hasNext()) {
next = aggregate.get(index);
index++;
}
return next;
}

@Override
public boolean hasNext() {
return index < aggregate.size();
}
}

// 4. ConcreteAggregate
public class ConcreteAggregate extends Aggregate{
private List<String> list = new ArrayList<>();

@Override
public Iterator createIterator() {
return new ConcreteIterator(this);
}

@Override
public void add(String string) {
list.add(string);
}

@Override
public void remove(String string) {
list.remove(string);
}

@Override
public String get(int index) {
return list.get(index);
}

@Override
public int size() {
return list.size();
}
}

// 5. Test
public class TestIterator {
public static void main(String[] args) {
Aggregate aggregate = new ConcreteAggregate();
aggregate.add("this");
aggregate.add("is");
aggregate.add("iterator");
aggregate.add("pattern");

Iterator iterator = aggregate.createIterator();
while (iterator.hasNext()){
System.out.print(iterator.next() + " ");
}
}
}

// 6. Result
this is iterator pattern

使用 List 数据结构来存放数据,它本身就实现了 Iterator 模式,这里只是举例来说明迭代器使用方法。

总结

Java 语言已经包含了迭代器接口 Interator,在实际使用中仅仅需要实现 Collection 集合就能应用迭代器模式,其中 List, Map 等等都都是常见迭代器容器。而 AndroidCursor 也是典型的迭代器模式。
迭代器模式分离了集合对象的遍历行为,抽象一个迭代器类来负责遍历操作,这样既可以不用暴露集合内部的数据结构,又可以让外部代码非常透明的访问集合内部的数据。

参考文档

  • 大话设计模式
  • Android 源码设计模式解析与实战
  • wiki-iterator