目录
1.Iterator模式
1.1 作用
Iterator模式用于在数据集合中按照顺序遍历集合。
1.2 示例程序
此处以一个遍历书架上的书为例子。
1.2.1 示例程序的类图
1.2.2 Aggregate接口
该接口中只有一个方法,该方法会生成一个用于遍历的迭代器。
//需要遍历的集合的接口
public interface Aggregate {
public abstract Iterator iterator();//创建迭代器对象
}
1.2.3 Iterator接口
该接口用于遍历集合中的元素。其中hasNext()方法用于判断是否存在下一个元素,该方法主要用于循环终止条件;next()方法获取当前元素,并指向下一个元素。
//迭代器接口
public interface Iterator {
public abstract boolean hasNext();//是否存在下一个元素
public abstract Object next();//返回当前的元素,并指向下一个元素
}
1.2.4 Book类
书籍类。
//书籍类
public class Book {
private String name;
public Book(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
1.2.5 BookShelf类
书架类。
//书架类,表示要被迭代的集合
public class BookShelf implements Aggregate{
private Book[] books;//存储多本书籍
private int last = 0;//表示最后一本书的下标,也可以表示当前书籍总数
public BookShelf(int maxsize) {
this.books = new Book[maxsize];
}
public Book getBookAt(int index) {//获取指定下标下的书籍
return books[index];
}
public void appendBook(Book book) {//增加书籍
this.books[last] = book;
last++;
}
public int getLength() {//获取当前书籍总数
return last;
}
@Override
public Iterator iterator() {//创建当前书架的迭代器对象
return new BookShelfIterator(this);
}
}
1.2.6 BookShelfIterator类
书架的迭代器的具体实现类。
//书架迭代器的具体实现
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() {
if (index < bookShelf.getLength()) {//如果下标未越界,说明还存在元素返回true
return true;
} else {
return false;
}
}
@Override
public Object next() {
Book book = bookShelf.getBookAt(index);//遍历取出当前下标的书籍
index++;//有一个向后移动指针的隐含动作
return book;
}
}
1.2.7 Main类
public class Main {
public static void main(String[] args) {
BookShelf bookShelf = new BookShelf(4);
bookShelf.appendBook(new Book("a"));
bookShelf.appendBook(new Book("b"));
bookShelf.appendBook(new Book("c"));
bookShelf.appendBook(new Book("d"));
Iterator iterator = bookShelf.iterator();//注意返回的是iterator,多态的实现
while (iterator.hasNext()) {
Book book = (Book) iterator.next();//需要向下强制转换类型
System.out.println(book.getName());
}
}
}
输出:
1.3 Iterator模式中的角色
- Iterator(迭代器):该角色负责定义按顺序逐个遍历元素的接口,主要定义了hasNext和next方法。
- ConcreteIterator(具体的迭代器):该角色负责实现Iterator角色所定义的接口。
- Aggregate(集合):该角色负责创建Iterator角色的接口。
- ConcreteAggregate(具体的集合):该角色负责实现Aggregate角色所定义的接口。
1.4 其他特点
- 引入Iterator的目的是将遍历与实现分离开来。查看下面这段代码,用到的方法就是迭代器的hasNext和next,并不依赖于BookShelf的实现。因此如果开发人员放弃使用数组来管理书本,而改用其他集合方式,对以下的while循环不需要进行任何修改,即开发逻辑是不变的,实现了while组件的可复用。
- 不要只使用具体类来编程,要优先使用抽象类和接口来编程。比如上面的迭代器返回的不是BookShelIterator这个具体的迭代器类型,而是Iterator这个接口,利用多态。
- 针对一个ConcreteAggregate角色可以编写多个ConcreteIterator,即一个具体集合类可以有多样化的具体实现的迭代器,比如:
- 从最后开始向前遍历(previous()方法)
- 指定下标进行跳跃式遍历
- 既可以从前向后遍历,也可以从后向前遍历(next()方法和previous()方法)
- 在Java中,不需要定义deleteIterator()方法,因为没有使用的对象实例将会被垃圾回收GC自动删除。
- 在java中,java.util.Collection接口的各种集合的实现类使用迭代器进行遍历即使用到了迭代器模式。
根据图解设计模式书籍进行整理。