- 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
- 迭代器模式让我们能游走于聚合内的每一个元素,而又不暴露其内部的表示。
- 把游走的任务放在迭代器上,而不是聚合上。这样简化了聚合的接口和实现,也让责任各得其所。
- 该模式依赖于Iterator接口
- 将元素的遍历和实现分离开来
- 主要角色
- 抽象聚合(Aggregate)角色:定义存储、添加、删除聚合对象以及创建迭代器对象的接口。
- 具体聚合(ConcreteAggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。
- 抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、first()、next() 等方法。
- 具体迭代器(Concretelterator)角色:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。
- 结构图
diedai.gifpublic class ChineseBook {
private String name;
public ChineseBook(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public interface Aggregate {
public abstract Iterator iterator();
}
public class ChineseBookShelf implements Aggregate {
private ChineseBook[] books;
int pointer=0;
public ChineseBookShelf(int max_size){
books=new ChineseBook[max_size];
}
public void appendChineseBook(ChineseBook book){
books[pointer]=book;
pointer++;
}
public ChineseBook findChineseBookAt(int index){
return books[index];
}
public int getLength(){
return pointer;
}
public Iterator iterator(){
return new ChineseBookShelfIterator(this);
}
}
关键点
public interface Iterator {
public abstract boolean hasNext();
public abstract Object next();
}
public class ChineseBookShelfIterator implements Iterator {
ChineseBookShelf bookShelf;
int index;
public ChineseBookShelfIterator(ChineseBookShelf bookShelf){
this.bookShelf=bookShelf;
index=0;
}
public boolean hasNext() {
if(index<this.bookShelf.getLength()){
return true;
}
return false;
}
public Object next() {
return bookShelf.findChineseBookAt(index++);
}
}
public class Main {
public static void main(String[] args) {
ChineseBook book1 = new ChineseBook("朝花夕拾");
ChineseBook book2 = new ChineseBook("围城");
ChineseBook book3 = new ChineseBook("遮天");
ChineseBook book4 = new ChineseBook("寻秦记");
ChineseBook book5 = new ChineseBook("骆驼祥子");
ChineseBookShelf bookShelf = new ChineseBookShelf(5);
bookShelf.appendBook(book1);
bookShelf.appendBook(book2);
bookShelf.appendBook(book3);
bookShelf.appendBook(book4);
bookShelf.appendBook(book5);
Iterator it= bookShelf.iterator();
while(it.hasNext()){
ChineseBook book=(ChineseBook)it.next();
System.out.println("书的名字为《"+book.getName()+"》");
}
}
}
如果这个时候有另外一个书架,但是他的实现方式是arrayList与上面的数组不同,那个就可以编写这个新书架的Iterator。如果要实现拿出两个书架的书,就可以创建相应的迭代器,简化获取书时的代码,也无需知道每个书架是怎么实现循环输出的。
网友评论