alexpdh's blog

Java设计模式(十七):迭代器模式

迭代器模式(iterator pattern)

迭代器模式(iterator pattern):属于对象的行为模式。提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。


迭代器模式UML图



迭代器模式涉及的角色

抽象迭代器(Iterator)角色:用于定义得到开始对象、得到下一个对象、判断是否到结尾、当前对象等抽象方法,统一接口。
具体迭代器(ConcreteIterator)角色:继承 Iterator,实现开始、下一个、是否结尾、当前对象等方法。
抽象聚集(Aggregate)角色:创建迭代器(Iterator)对象的。
具体聚集(ConcreteAggregate)角色:实现了创建迭代器(Iterator)对象,返回一个合适的具体迭代子实例。


示例代码

迭代器抽象类 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
package com.example.iteratorPattern;
/**
* 迭代器模式:迭代器抽象类
*
* @author pengdh
* @date: 2017-07-24 23:10
*/
public abstract class Iterator {
/**
* 移动到第一个元素
*/
public abstract void first();
/**
* 移动到下一个元素
*/
public abstract void next();
/**
* 判读是否为最后一个元素
*/
public abstract boolean isDone();
/**
* 返还当前元素
*/
public abstract Object currentItem();
}

聚集抽象类 Aggregate

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.example.iteratorPattern;
/**
* 迭代器模式:聚集抽象类
*
* @author pengdh
* @date: 2017-07-24 23:17
*/
public abstract class Aggregate {
/**
* 工厂方法,创建相应迭代器对象的
*/
public abstract Iterator createIterator();
}

具体迭代器类 ConcreteIterator

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
package com.example.iteratorPattern;
/**
* 迭代器模式:具体迭代器类
*
* @author pengdh
* @date: 2017-07-24 23:16
*/
public class ConcreteIterator extends Iterator {
//持有被迭代的具体的聚合对象
private ConcreteAggregate agg;
//内部索引,记录当前迭代到的索引位置
private int index = 0;
//记录当前聚集对象的大小
private int size = 0;
public ConcreteIterator(ConcreteAggregate agg) {
this.agg = agg;
this.size = agg.size();
index = 0;
}
@Override
public void first() {
index = 0;
}
@Override
public void next() {
if (index < size) {
index++;
}
}
@Override
public boolean isDone() {
return (index >= size);
}
@Override
public Object currentItem() {
return agg.getElement(index);
}
}

具体聚集类 ConcreteAggregate

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
package com.example.iteratorPattern;
/**
* 迭代器模式:具体聚集类
*
* @author pengdh
* @date: 2017-07-24 23:20
*/
public class ConcreteAggregate extends Aggregate {
private Object[] objArray = null;
/**
* 构造方法,传入聚合对象的具体内容
*/
public ConcreteAggregate(Object[] objArray) {
this.objArray = objArray;
}
@Override
public Iterator createIterator() {
return new ConcreteIterator(this);
}
/**
* 取值方法:向外界提供聚集元素
*/
public Object getElement(int index) {
if (index < objArray.length) {
return objArray[index];
} else {
return null;
}
}
/**
* 取值方法:向外界提供聚集的大小
*/
public int size() {
return objArray.length;
}
}

客户端测试类 IteratorPatternTest

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.example.iteratorPattern;
/**
* 迭代器模式:客户端测试类
*
* @author pengdh
* @date: 2017-07-24 23:26
*/
public class IteratorPatternTest {
public static void main(String[] args) {
Object[] objArray = {"One", "Two", "Three", "Four", "Five", "Six"};
//创建聚合对象
Aggregate agg = new ConcreteAggregate(objArray);
//循环输出聚合对象中的值
Iterator it = agg.createIterator();
while (!it.isDone()) {
System.out.println(it.currentItem());
it.next();
}
}
}

参考文献

alexpdh wechat
欢迎扫一扫关注 程序猿pdh 公众号!