Iterator 模式
我们在学习数组的时候,想要拿到数组的内容,避免少用不了循环语句犹如下面的语句
实际上拿到拿到每一个数据项的同时,就是依次访问数组中的元素,arr[0],arr[1]等
UML(单纯实现一个放书过程)
- 两个顶层接口 Aggregate 生成iterator Iterator 接口 用于具体的实例用到的方法
- bookshelf 主要返回一个本省的一个迭代器实例
- bookshelftiterator 是实现book过程iterator的主要接口
- book 一个普通的书实体类
主要code
- book
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 + "]";
}
}
- Aggregate interface
public interface Aggregate {
public abstract Iterator iterator();
}
public interface Iterator {
public abstract boolean hasNext();
public abstract Object next();
}
- BookShelf
public class BookShelf implements Aggregate{
private Book [] books;
private int last=0;//指针
public BookShelf(int size) {
this.books=new Book[size];
}
public Book getBook(int index) {
return books[index];
}
public void appendBook(Book book) {
this.books[last]=book;
last++;//指针
}
public int getLength() {
return last;
}
@Override
public Iterator iterator() {
return new BookShelfIterator(this);
}
}
- BookShelfIterator
public class BookShelfIterator implements Iterator {
private BookShelf bookshelf;
private int index;
public BookShelfIterator(BookShelf bookShelf) {
this.bookshelf = bookShelf;
this.index = 0;
}
@Override
public boolean hasNext() {
if (this.index < bookshelf.getLength()) {
return true;
} else {
return false;
}
}
@Override
public Object next() {
Book book = bookshelf.getBook(index);//指针
index++;
return book;
}
}
- 测试类 Main
public class Main1 {
public static void main(String[] args) {
BookShelf bookShelf = new BookShelf(3);
bookShelf.appendBook(new Book("a"));
bookShelf.appendBook(new Book("b"));
bookShelf.appendBook(new Book("c"));
Iterator it = (Iterator) bookShelf.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
role 作用
- iterator : 负责遍历元素的接口 ,hasnext()用于判断是否存在下一个 next() 用于取出下一个
- concreteiterator : 具体的实现类,booksheftiterator 包含了由bookiterator返回的所有信息.
- bookshelt :一个是作为数据的容器因为本省继承了aggregate接口,另一个是作为产生当前实例迭代器的一个总的实例对象.他们同时在内部需要维护一个指针.
- concreteAggregate: 创建出具体的iterator对象,例子中由于booksheft扮演这个角色.
- 总结表格
| Aggregate | 集合接口 >>可用java本省提供的代替
| Book | 普通实体类
| BookShelf |代表书架
| BookShelfIterator | 代表书架的迭代期
| Iterator | 遍历接口>>也可以用本身的代替
| Main1 | 测试类
需要理解的重点知识
- 生成的iterator实例并不依赖与具体的迭代器实现,在我们维护的booksheftiterator 中只要能够保证booksheft返回的实例是正确的,那么程序就会执行下去.说简单点我们针对 Iterator进行有效的编程.
2.维护的booksheft的Iteraotr 中next() 是指返回当前值,并且指向下一个值
3.hasnext()是"最后一个"保证在while循环中能够正确的去执行.
4.如果需要多个迭代期,在顶层接口集合中Aggregate增加即可
5.如果你使用java编写那么不需要deleteiterator - 例子中是使用的数组保存数据,我们可以使用java中已经维护好的数据结构进行操作
7.可以使用java已经为我们提供好的一些接口实现
相关模式
- vistor 模式: 与迭代器最大的不同是对于每次拿到的数据要进行固定的处理
- Factory Method模式: 生成实例过程中可能会用到的工厂模式