Iterator 模式
1.什么是 Iterator 模式
Iterator 模式就是按照顺序遍历数据集合。
2.示例程序
1.Aggregate 接口
Aggregate 接口是要遍历的集合的接口,声明方法 iterator ,实现了该接口的类可以通过 iterator 方法遍历数据集合的元素。
public interface Aggregate {// 返回值是Iterator,体现和集合类的实现无关性,只返回迭代器类迭代到的数据public abstract Iterator iterator();
}
2.Iterator 接口
Iterator 接口用于遍历集合中的元素。
这里先提供两个方法 hasNext 和 next 。
public interface Iterator {public abstract boolean hasNext();// 这里的next方法是要有返回值的public abstract Object next();
}
3.BookShelf 类(实现 Aggregate)
BookShelf 是一个集合,实现了 Aggregate 接口。可以被 BookShelfIterator 遍历。
public class BookShelf implements Aggregate{// 本类是Book类的集合,使用ArrayList存储Book对象,便于书架中进行添加书等操作private ArrayList<Book> books;// 构造方法,初始化集合对象public BookShelf() {this.books = new ArrayList<Book>();}// iterator方法,用来遍历本集合public Iterator iterator() {// BookShelfIterator会返回迭代的结果return new BookShelfIterator(this);}// 添加书本public void addBook(Book book) {books.add(book);}// 根据索引查找书本public Book getBook(int index) {return books.get(index);}// 返回书本数量public int getLength() {return books.size();}
}
4.Book 类(BookShelf 的属性)
表示书的类,是 BookShelf 类这个集合的元素。
public class Book {private String name;public Book(String name) {this.name = name;}public String getName() {return name;}
}
5.BookShelfIterator 类(实现 Iterator)
用于遍历 BookShelf 的迭代器,实现了 Iterator ,作用是将 BookShelf 的实现和遍历分离。
public class BookShelfIterator implements Iterator{// 本类对BookShelf进行遍历,添加BookShelf对象private BookShelf bookShelf;// 要根据索引对bookShelf进行操作private int index;public BookShelfIterator(BookShelf bookShelf) {this.bookShelf = bookShelf;this.index = 0;}// 可以理解为是否还能遍历,即调用next()public boolean hasNext() {// 索引等于长度的时候就超出去了if (index < bookShelf.getLength()) {return true;} else {return false;}}public Object next() {Book book = bookShelf.getBook(index);index++;return book;}
}
6.Main
程序测试类。
public class Main {public static void main(String[] args) {BookShelf bookShelf = new BookShelf();bookShelf.addBook(new Book("地球往事"));bookShelf.addBook(new Book("黑暗森林"));bookShelf.addBook(new Book("死神永生"));bookShelf.addBook(new Book("流浪地球"));// 创建迭代器Iterator it = new BookShelfIterator(bookShelf);// 迭代while (it.hasNext()) {Book book = (Book)it.next();System.out.println(book.getName());}}
}//程序执行结果:
/*地球往事
黑暗森林
死神永生
流浪地球*/
3.思考
1.类图
2.Iterator
1.Iterator 的实现类可以有多个,可以设计多种遍历方式,至于使用哪种方式,就要看集合实现类中调用 iterator 方法时 new 的是哪一个迭代器。
*2.Iterator 可以将集合实现类的实现和遍历分离开来,当使用诸如 while 循环来遍历集合时,不需要依赖集合的实现,只需要使用迭代器类的方法如 hasNext() 和 next(),这也是为什么要使用 Iterator 模式。
3.集合类和迭代器类的关系
集合的实现类和迭代器的实现类是有对应关系的,一但集合类的某些API发生变化,是需要修改迭代器类的。
如果对您有帮助,请点赞关注支持我,谢谢!❤
如有错误或者不足之处,敬请指正!❤
个人主页:星不易 ♥
设计模式专栏:不易|设计模式 ♥