二十三设计模式 之 迭代器模式(Iterator)
最近开始看设计模式,随手记下笔记。如有问题,望指正。
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
迭代器模式中的角色:
迭代器(Iterator):负责定义按顺序逐个遍历元素的迭代器接口。由Iterator接口扮演,定义了hasNext和next两个方法。hasNext用于判断是否存在下一个元素,next方法则用于获取该元素并移动迭代器。
具体的迭代器(ConcreteIterator):负责实现Iterator角色定义的接口,由BookShelfIterator扮演该角色。包含了遍历集合所必须的信息。
集合(Aggregate):该角色负责定义集合接口,Iterable接口扮演该角色。这个接口是iterator()方法,能创建出自身具体的迭代器角色。
具体的集合(ConcreteAggregate):负责实现Aggregate角色定义的接口,即实现iterator()方法。BookShelf扮演该角色。
Book类,存储书籍信息。
public class Book {
//表示书的类,存储书的名字,并重写toString方法
private String name = null;
public Book(String name) {
this.setName(name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
书架类,存储Book类,实现了Iterable接口中的iterator方法,即返回一个自身的迭代器。
public class BookShelf implements Iterable<Book>{
private Book[] books = null;
private int last = 0;
public BookShelf(int size) {
books = new Book[size];
}
public void addBook(Book book){
this.books[last] = book;
last++;
}
public Book getBook(int cur){
return books[cur];
}
public int getLenth(){
return last;
}
@Override
public Iterator iterator() {
return new BookShelfIterator(this);
}
}
书架迭代器类,实现了Iterator接口以及hasnext和next方法。存储了BookShelf类的引用,方便获取信息。
public class BookShelfIterator implements Iterator<Book> {
private BookShelf bookShelf = null;
private int index = 0;
public BookShelfIterator(BookShelf bookShelf) {
this.bookShelf = bookShelf;
this.index = 0;
}
@Override
public boolean hasNext() {
if(index<bookShelf.getLenth())
return true;
return false;
}
@Override
public Book next() {
Book book = bookShelf.getBook(index);
index++;
return book;
}
}
测试
public class Text {
public static void main(String[] args) {
BookShelf bs = new BookShelf(10);
bs.addBook(new Book("设计模式"));
bs.addBook(new Book("Java编程思想"));
bs.addBook(new Book("C++编程"));
bs.addBook(new Book("Python速成"));
bs.addBook(new Book("Web网页设计"));
Iterator it = bs.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
for (Book book : bs) {
System.out.println(book);
}
}
}
/*out:
设计模式
Java编程思想
C++编程
Python速成
Web网页设计
设计模式
Java编程思想
C++编程
Python速成
Web网页设计
*/
优点:
1、引入Iterator后可以将遍历与实现分离开来,在遍历时只需调用迭代器的方法,而不用关心具体集合实现类的方法。
2、迭代器简化了集合接口。有了迭代器的遍历接口,集合不再需要类似的接口,也不再关注具体的遍历实现。
3、在同一集合中可以有多个遍历。每个迭代器保持着自己的遍历状态,所以一个集合同时可以进行多个遍历。
参考自《图解设计模式》