设计模式(14)——迭代器模式
本文介绍迭代器模式的概念和应用。
# 基本思想和原则
迭代器模式提供一种方法访问一个容器对象中的各个元素,而又不需要暴露该对象的内部细节。
# 动机
迭代器模式有两个主要的使用动机:封装性和统一的访问模式。现在很多语言都提供了现成的迭代器模式实现,比如 Java 中的各种 Collection 类型:ArrayList、Set、HashMap 等,大部分情况下我们不用自己去实现迭代器模式,只要使用现成的集合类型即可。
# 实现
public class Book {
private ArrayList<Page> pageArrayList = new ArrayList<Page>();
public void add(Page page) {
this.pageArrayList.add(page);
}
public void remove(Page page) {
this.pageArrayList.remove(page);
}
public IBookIterator iterator() {
return new IBookIterator(this.pageArrayList);
}
}
public class IBookIterator implements Iterator {
private ArrayList<Page> pageArrayList;
private int currentIdx = 0;
public IBookIterator(ArrayList<Page> bookArrayList) {
this.pageArrayList = bookArrayList;
}
public boolean hasNext() {
return currentIdx < this.pageArrayList.size();
}
@Override
public Page next() {
return (Page)this.pageArrayList.get(this.currentIdx++);
}
}
public class Page {
private int pageNumber;
public Page(int pageNumber) {
this.pageNumber = pageNumber;
}
public int getPageNumber() {
return pageNumber;
}
}
public class Test {
public static void main(String[] args) {
Book book = new Book();
book.add(new Page(1));
book.add(new Page(2));
book.add(new Page(3));
book.add(new Page(4));
book.add(new Page(5));
IBookIterator bookIterator = book.iterator();
while (bookIterator.hasNext()) {
Page page = bookIterator.next();
System.out.println("Page number: " + page.getPageNumber());
}
}
}
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
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
输出如下:
Page number: 1
Page number: 2
Page number: 3
Page number: 4
Page number: 5
1
2
3
4
5
2
3
4
5
上面的代码模拟了一本书翻页的过程,一本书中包含很多页面,这就是一个应用迭代模式的场景。Book
类有有一个iterator
方法,这个方法会返回一个IBookIterator
类型的书中页面的迭代器,IBookIterator
类实现了Iterator
接口中的hasNext
和next
方法。
# 优点
封装性好,提供统一的访问模式。
编辑 (opens new window)
上次更新: 2024-07-15, 03:27:09