不要只使用具体的类来编程,要优先使用抽象类和接口来编程
角色
- Aggregate:集合。
定义创建 Iterator 角色的接口。
- ConcreteAggrate:具体集合类。
负责实现 Aggragate 所定义的接口。
- Iterator:迭代器。
定义按顺序逐个遍历元素的接口(API)。包括 hasNext 和 next 两个方法。
- ConcreteIterator:具体迭代器。
负责实现 Iterator 所定义的接口(API)
实现方法
Aggregate
public interface Aggregate {
public abstract Iterator iterator();
}
Iterator
public interface Iterator {
public abstract boolean hasNext();
public abstract Object next();
}
Book(实体类)
public class Book {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
BookSelf(ConcreteAggregate)
public class BookSelf implements Aggregate {
private Book[] books;
private int last = 0;
public BookSelf(int maxsize) {
this.books = new Books[maxsize];
}
public Iterator iterator() {
return new BookSelfIterator(this);
}
public Book getBookAt(int index) {
return books[index];
}
public Book[] appendBook(Book book) {
this.books[last] = book;
last++;
return book;
}
public int getLength() {
//return books.length();
return last;
}
}
BookSelftIterator(ConcreteIterator)
public class BookSelfIterator implements Iterator {
private BookSelft bookself;
private int index;
public BookSelftIterator(BookSelf bookself) {
this.bookself = bookself;
this.index = 0;
}
// 判断是否还有下一个元素
public boolean hasNext() {
if (index < bookself.getLength()) {
return true;
} else {
return false;
}
}
// 获取当前元素,并指向下一个元素
public Object next() {
Book book = bookselft.getBookAt(index);
index++;
return book;
}
}
测试
public class IteratorTest {
public static void main(String[] args) {
BookSelf bookself = new BookSelft(3);
bookself.appendBook(new Book("《平凡的世界》"));
bookself.appendBook(new Book("《活着》"));
bookself.appendBook(new Book("《百年孤独》"));
Iterator it = bookself.iterator();
while(it.hasNext()) {
Book book = (Book)it.next();
System.out.println(book.getName());
}
}
}
注意
容易弄错“下一个”
iterator.next() 含义 returnCurrentElementAndAdvanceToNextPosition(返回当前元素并指向下一个元素)
容易弄错“最后一个”
(boolean) iterator.hasNex() 在返回最后一个元素前会返回 true,但返回最后一个元素后会返回 false。故 hasNext() 直接理解成 “确认 接下来 是否可以调用 next() 方法了”。
多个 Iterator
将遍历功能置于 Aggregate 角色之外 时 Iterator 模式的一个特征。根据该特征,可以针对 ConcreteAggragate 编写多个 ConcreteIterator。
N 种迭代器种类
遍历方法 N 种:
- 既可以从前向后遍历,也可以从后向前遍历( next & previous )
- 指定下标进行 跳跃式 遍历
无需 deleteIterator
因为在 Java 中,没有被使用的对象会自动被 GC。
网友评论