Design Patterns(十五) Iterator

Iterator pattern is very commonly used design pattern in Java and .Net programming environment. This pattern is used to get a way to access the elements of a collection object in sequential manner without any need to know its underlying representation.

前言

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

迭代器模式

基本介绍:

1) 迭代器模式(Iterator Pattern)是常用的设计模式,属于行为型模式;
2) 如果我们的 集合 元 素是用不同的方式实现 的,有数组,还有java的集合类,或者还有其他方式,当客户端要 遍历这 些 集合 元 素 的时候就要使用多种遍历方式,而且还会暴露元素的内部结构,可以考虑使用迭代器模式解决;
3) 迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即:不暴露其内部的结构。

角色介绍:

1)Iterator(迭代器)迭代器定义访问和遍历元素的接口;
2)ConcreteIterator (具体迭代器)具体迭代器实现迭代器接口对该聚合遍历时跟踪当前位置;
3)Aggregate (聚合)聚合定义创建相应迭代器对象的接口;
4)ConcreteAggregate (具体聚合)具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。

迭代器模式-UML图:


迭代器模式-实例图:


代码:

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
import java.util.ArrayList;
import java.util.List;

/**
* @Auther: Arsenal
* @Date: 2020-03-19 23:55
* @Description: 迭代器模式
*/
public class IteratorDemo {
public static void main(String[] args) {

BookShelf bookShelf = new BookShelf();
bookShelf.appendBook(new Book("Around the World in 80 Days"));
bookShelf.appendBook(new Book("Bible"));
bookShelf.appendBook(new Book("Cinderella"));
bookShelf.appendBook(new Book("Daddy-Long-Legs"));
Iterator it = bookShelf.iterator();
while (it.hasNext()) {
Book book = (Book) it.next();
System.out.println(book.getName());
}
}
}

interface Aggregate {
public abstract Iterator iterator();
}

interface Iterator {
public abstract boolean hasNext();

public abstract Object next();
}

class Book {
private String name;

public Book(String name) {
this.name = name;
}

public String getName() {
return name;
}
}

class BookShelf implements Aggregate {

private List<Book> books;


public BookShelf() {
this.books = new ArrayList<Book>();
}

public Book getBookAt(int index) {
return books.get(index);
}

public void appendBook(Book book) {
books.add(book);
}

public int getLength() {
return books.size();
}

public Iterator iterator() {
return new BookShelfIterator(this);
}
}

class BookShelfIterator implements Iterator {

private BookShelf bookShelf;
private int index;

public BookShelfIterator(BookShelf bookShelf) {
this.bookShelf = bookShelf;
this.index = 0;
}

public boolean hasNext() {
if (index < bookShelf.getLength()) {
return true;
} else {
return false;
}
}


public Object next() {
Book book = bookShelf.getBookAt(index);
index++;
return book;
}
}

总结

迭代器模式的注意事项和细节:

优 点

1) 提供一个统一的方法遍历对象,客户不用再考虑聚合的类型,使用一种方法就可以遍历对象了;
2) 隐藏了聚合的内部结构,客户端要遍历聚合的时候只能取到迭代器,而不会知道聚合的具体组成;
3) 提供了一种设计思想,就是一个类应该只有一个引起变化的原因(叫做 单一责任原则 )。在聚合类中,我们把迭代器分开,就是要把管理对象集合和遍历对象集合的责任分开,这样一来集合改变的话,只影响到聚合对象。而如果遍历方式改变的话,只影响到了迭代器;
4) 当要展示一组相似对象,或者遍历一组相同对象时使用, 适合使用迭代器模式。

缺 点
每个聚合对象都要一个迭代器,会生成多个迭代器不好管理类。

延伸

    迭代器模式
    迭代器模式-菜鸟教程
    迭代器模式简析
    Design Patterns - Iterator Pattern
    尚硅谷Java设计模式,韩顺平图解java设计模式

Content
  1. 1. 前言
  2. 2. 迭代器模式
  3. 3. 总结
  4. 4. 延伸