【图解设计模式】Iterator模式

按照统一的方法遍历集合中的元素。

示例

将书(Book)放置到书架(BookShelf)中,并将书的名字按顺序显示出来。

类图

9zl4fO.png

Aggregate接口

1
2
3
public interface Aggregate {
Iterator iterator();
}

Iterator接口

1
2
3
4
public interface Iterator {
boolean hasNext();
Object next();
}

Book类

1
2
3
4
5
6
7
8
9
10
11
public class Book {
private String name;

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

public String getName() {
return name;
}
}

BookShelf类

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
public class BookShelf implements Aggregate {
private Book[] books;
private int last;

public BookShelf(int maxsize) {
this.books = new Book[maxsize];
this.last = 0;
}

public Book getBookAt(int index) {
return books[index];
}

public void appendBook(Book book) {
books[last++] = book;
}

public int getLength() {
return last;
}

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

BookShelfIterator类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class BookShelfIterator implements Iterator {
private BookShelf bookShelf;
private int index;

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

@Override
public boolean hasNext() {
return index < bookShelf.getLength() ? true : false;
}

@Override
public Object next() {
return bookShelf.getBookAt(index++);
}
}

Main类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Main {

public static void main(String[] args) {
BookShelf bookShelf = new BookShelf(4);
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 = new BookShelfIterator(bookShelf);
while (it.hasNext()) {
Book book = (Book) it.next();
System.out.println(book.getName());
}
}
}

运行结果

1
2
3
4
Around the World in 80 Days
Bible
Cinderella
Daddy-Long-Legs

登场角色

Iterator(迭代器)

该角色负责定义按顺序逐个遍历元素的接口(API)。在示例程序中,由Iterator接口扮演这个角色,它定义了hasNext和next两个方法。其中,hasNext方法用于判断是否存在下一个元素,next方法则用于获取该元素。

ConcreteIterator(具体的迭代器)

该角色负责实现Iterator角色所定义的接口(API)。在示例程序中,由BookShelfIterator类扮演这个角色。该角色中包含了遍历集合所必需的信息。在示例程序中,BookShelf类的实例保存在bookShelf字段中,被指向的书的下标保存在index字段中。

Aggregate(集合)

该角色负责定义创建Iterator角色的接口(API)。这个接口(API)是一个方法,会创建出“按顺序访问保存在我内部元素的人”。在示例程序中,由Aggregate接口扮演这个角色,它里面定义了iterator方法。

ConcreteAggregate(具体的集合)

该角色负责实现Aggregate角色所定义的接口(API)。它会创建出具体的Iterator角色,即ConcreteIterator角色。在示例程序中,由BookShelf类扮演这个角色,它实现了iterator方法。

类图

9z19Xj.png