很多时候我们都是使用的是for(int i = 0; i < arr.length; i++)来遍历数组,这儿主要是使用的是i的自加,从而实现数组的遍历。Iterator模式主要适用于在数据集合中顺序遍历聚合。
Iterator模式的示例程序
这段程序的作用就是将书放在书架,并且按照书的名字顺序遍历出来。
类图如下
大多数都用过自带的迭代器去遍历聚合的元素,如上面的类图所示,Iterator模式主要的类需要四个
- Iterator(迭代器):主要负责的是顺序遍历元素的接口,有hasNext和next两个方法,hasNext是判断是否存在下一个元素,next是获取该元素。
- BookShelfIterator(具体的迭代器):包含了遍历集合的所必须的信息,下标保存在index中。
- Aggregate(集合):定义了创建Iterator角色的接口,提供创建iterator的方法 .
- BookShelf(具体的集合):该角色实现了Aggregate的接口类方法,给出了具体创建iterator的方法
具体的代码
com.gof.iterator.Aggregate.java
里面只有一个iterator的方法,若是想遍历集合的时候,通过这个方法生成一个Iterator接口的类实例,在这儿就是生成一个BookShelfIterator实例。
/**
*
* @author Alice
* 这个接口目的是表示集合,里面只有一个方法,这个方法是生成一个用于遍历集合的迭代器
*/
public interface Aggregate {
/**
* 迭代器
* @return
*/
public abstract Iterator iterator();
}
com.gof.iterator.Iterator.java
根据面向接口编程的思想,在接口中声明类的抽象方法。
public interface Iterator {
//判断下一个元素是否存在
public abstract boolean hasNext();
//对集合中的元素进行下一个移动
public abstract Object next();
}
com.gof.iterator.BookShelf .java
Aggregate类的作用就是生成一个Iterator的实例,BookShelf是一个表示书架的类,需要将该类作为集合去处理,所以实现了Aggregate接口,
public class BookShelf implements Aggregate {
private Book[] books;
private int last = 0;
//通过构造函数多书名进行赋值
public BookShelf(int maxsize){
this.books = new Book[maxsize];
}
public Book getbookAt(int index){
return books[index];
}
public void appendBook(Book book){
this.books[last] = book;
last++;
}
public int getLength(){
return last;
}
public Iterator iterator() {
return new BookShelfIterator(this);
}
}
com.gof.iterator.BookShelfIterator.java
改类实现了Iterator接口,是具体的实现遍历集合的代码。
public class BookShelfIterator implements Iterator {
private BookShelf bookShelf;
private int index;
public BookShelfIterator(BookShelf bookShelf) {
super();
this.bookShelf = bookShelf;
this.index = 0;
}
public boolean hasNext() {
if(index<bookShelf.getLength()){
return true;
}else{
return false;
}
}
public Object next() {
Book book = bookShelf.getbookAt(index);
index++;
return book;
}
}
com.gof.iterator.Book.java
/**
* 这个类的作用就是通过getName获取书名,
* @author Alice
*
*/
public class Book {
private String name;
public Book(String name){
this.name = name;
}
public String getName() {
return name;
}
}
测试类
public class Main {
public static void main(String[] args) {
BookShelf bookShelf = new BookShelf(4);
bookShelf.appendBook(new Book("java编程思想"));
bookShelf.appendBook(new Book("mysql从入门到放弃"));
bookShelf.appendBook(new Book("Spring in Action"));
bookShelf.appendBook(new Book("北方有佳人"));
Iterator it = bookShelf.iterator();
while(it.hasNext()){
Book book = (Book)it.next();
System.out.println(book.getName());
}
}
}