前言
这次要介绍的是迭代器模式,也是一种行为模式。我现在觉得写博客有点应付了,前阵子一天一篇,感觉这样其实有点没理解透彻就写下来了,而且写完后自己也没有多看几遍,上次在面试的时候被问到java中的I/O的各种实现用到了什么设计模式,我愣是想半天没想出来了,人家还给提示了我也没想出来,最后还是面试官给出的答案,是装饰模式,听到答案后就恍然大悟了,前两天刚看了装饰模式,还写下了I/O操作中的各种类都是用到了装饰模式,后来想想两方面原因造成的当时没回答出来,一是面试时紧张就容易想不起来,二是对设计模式理解的还是不够透彻。所以以后宁可写博客慢一些也要将自己写的东西理解透彻了。
迭代器模式
概念介绍
迭代器模式,又称游标模式。这种模式提供一种方法访问一个容器对象中各个元素,而又不需要暴露该对象的内部细节。这种模式其实我们日常开发中也很常见,例如下面的场景:
复制代码
java.util.Iterator
it = list.iterator();
while (it.hasNext()){
//using "it.next();" do some business logic
}
复制代码
这样来理解简单一些,下面还是通过具体的场景例子来实现迭代器模式。
举例
一个书架上放着好几本书,现在我想知道书架上都有哪些书,并且都把书名打印出来。那么书架就可以具有迭代的功能,能把它存放的所有书籍都迭代出来。用代码实现如下:
定义一个迭代器接口,包含检测是否还有下一个元素的方法和获得下一个元素的方法
复制代码
/**
* 迭代器接口
*/
public interface Iterator {
/**
* 检测是否还有下一个元素
* @return
*/
public abstract boolean hasNext();
/**
* 获得下一个元素
* @return
*/
public abstract Object next();
}
复制代码
定义含有迭代器对象的接口
复制代码
/**
* 只有实现此接口的才可以获得迭代器对象
*/
public interface Aggregate {
/**
* 获得迭代器对象
* @return
*/
public abstract Iterator iterator();
}
复制代码
书籍类
复制代码
/**
* 书籍类
*/
public class Book {
//书籍名称
private String name = "";
public Book(String name){
this.name = name;
}
/**
* 获得书籍名称
* @return
*/
public String getName(){
return name;
}
}
复制代码
书架类
复制代码
/**
* 书架类
*/
public class BookShelf implements Aggregate{
private Book[] books;
private int last = 0;
public BookShelf(int maxSize){
this.books = new Book[maxSize];
}
/**
* 获得书籍
* @param index
* @return
*/
public Book getBookAt(int index){
return books[index];
}
/**
* 添加书籍
* @param book
*/
public void appendBook(Book book){
this.books[last] = book;
last++;
}
/**
* 获得书架上的书籍数量
* @return
*/
public int getLength(){
return books.length;
}
/**
* 获得书架迭代器对象
* @return
*/
@Override
public Iterator iterator(){
return new BookShelfIterator(this);
}
}
复制代码
书架迭代器
复制代码
/**
* 书架迭代器
*/
public class BookShelfIterator implements Iterator {
private BookShelf bookShelf;
private int index;
public BookShelfIterator(BookShelf bookShelf){
this.bookShelf = bookShelf;
this.index = 0;
}
/**
* 检测是否还有下一本书
* @return
*/
@Override
public boolean hasNext() {
if(index