迭代器模式
参考书籍:图解设计模式
文章: 参考链接一
-
什么是迭代模式
Iterator模式也叫迭代模式,是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator按顺序进行遍历访问的设计模式。 -
不使用迭代模式的应用
在应用Iterator模式之前,首先应该明白Iterator模式用来解决什么问题。或者说,如果不使用Iterator模式,会存在什么问题。
由容器自己实现顺序遍历。直接在容器类里直接添加顺序遍历方法
让调用者自己实现遍历。直接暴露数据细节给外部 -
不使用迭代模式的缺点
容器类承担了太多功能:一方面需要提供添加删除等本身应有的功能;一方面还需要提供遍历访问功能。
往往容器在实现遍历的过程中,需要保存遍历状态,当跟元素的添加删除等功能夹杂在一起,很容易引起混乱和程序运行错误等。 -
迭代模式的角色和职责
iterator(迭代器接口):该接口必须定义实现迭代功能的最小定义方法集,比如提供hasNext()和next()方法。
ConcreteIterator(迭代器实现类): 比如BookShelfIterator,迭代器接口Iterator的实现类。可以根据具体情况加以实现。
Aggregate(容器接口):定义基本功能以及提供类似Iterator iterator()的方法。
ConcreteAggregate(容器实现类): 比如BookShelf,容器接口的实现类。必须实现Iterator iterator()方法。 -
迭代模式的优点
最重要的一个因素,引用Iterator可以使遍历和实现分离开来。
容器类承担了太多功能:一方面需要提供添加删除等本身应有的功能;一方面还需要提供遍历访问功能。
往容器在实现遍历的过程中,需要保存遍历状态,当跟元素的添加删除等功能夹杂在一起,很容易引起混乱和程序运行错误等。
- 代码示例
package com.xiaoxu.design.iterator;
/**
* 迭代器接口
*/
public interface Iterator {
Object next();
boolean hasNext();
}
package com.xiaoxu.design.iterator;
/**
* 容器接口
*/
public interface Aggregate {
Iterator iterator();
}
package com.xiaoxu.design.iterator;
/**
* 书架
*/
public class BookShelf implements Aggregate {
private Book [] books;
private int last = 0;
public BookShelf(int maxSize) {
books = new Book[maxSize];
}
@Override
public Iterator iterator() {
return new BookShelfIterator(this);
}
public Book getBookAt(int index) {
return books[index];
}
public void appendBook(Book book){
books[last] = book;
last ++;
}
public int getLength(){
return last;
}
}
package com.xiaoxu.design.iterator;
/**
* 书架迭代器实现类
*/
public class BookShelfIterator implements Iterator {
private BookShelf bookShelf;
private int index;
public BookShelfIterator(BookShelf bookShelf) {
this.bookShelf = bookShelf;
index = 0;
}
@Override
public Object next() {
Book book=bookShelf.getBookAt(index);
index ++;
return book;
}
@Override
public boolean hasNext() {
if(bookShelf.getLength() > index){
return true;
}
return false;
}
}
package com.xiaoxu.design.iterator;
public class Book {
private String name;
public Book(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
'}';
}
}
验证:
@Test
public void t1(){
BookShelf bookShelf = new BookShelf(5);
bookShelf.appendBook(new Book("大话设计模式"));
bookShelf.appendBook(new Book("深入理解Java虚拟机"));
bookShelf.appendBook(new Book("Java编程思想"));
Iterator iterator = bookShelf.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
result: