设计模式-迭代器模式

迭代器模式

定义

提供一种方法顺序访问一个聚合对象中的各个元素,而又无需暴露该对象的内部表示。

类图

迭代器模式

Iterator(迭代器)

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

ConcreteIterator(具体迭代器)

它负责实现Iterator所定义的接口。

Aggregate(集合)

它负责定义创建Iterator角色的接口。这个接口是一个方法,会创建出“按顺序访问保存在我内部元素的人”。

ConcreteAggregate(具体的集合)

负责实现Aggregate所定义的接口。它会创建出具体的Iterator角色,即ConcreteIterator角色。

示例

示例类图

示例类图

类和接口的一览表

名字 说明
Aggregate 表示集合的接口
Iterator 遍历集合的接口
Book 表示书的类
BookShelf 表示书架的类
BookShelfIterator 遍历书架的类
Main 测试类

Aggregate接口

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

Iterator接口

1
2
3
4
public interface Iterator {
public abstract boolean hasNext();
public abstract 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 this.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
public class BookShelf implements Aggregate{
private ArrayList<Book> books;

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

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

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

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

@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
20
21
22
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();
}

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

}

Main类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Main {
public static void main(String[] args) {
BookShelf bookShelf = new BookShelf(10);
for (int index = 0; index < 10;index++) {
bookShelf.appendBook(new Book(index + ""));
}

Iterator bIterator = bookShelf.iterator();
while(bIterator.hasNext()) {
Book book = (Book) bIterator.next();
System.out.println(book.getName());
}
}

}

总结

为什么一定要考虑引入Iterator这种复杂的设计模式呢?如果是数组,直接使用for循环语句进行遍历处理不就可以了么?为什么要在集合之外引入Iterator这个角色呢?

一个重要的理由是,引入Iterator后可以将遍历与实现分离开来。请看下面的代码:

1
2
3
4
while(bIterator.hasNext()) {
Book book = (Book) bIterator.next();
System.out.println(book.getName());
}

这里只使用了Itreator的hasNext和next方法,并没有调用BookShelf的方法。也就是说,这里的while循环并不依赖于BookShelf的实现

0%