迭代器模式
需求
一个实体类Book,一个Book的集合类 BookList,BookList提供遍历方法。
实现
Book类
public class Book {
private String name;
public Book(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
BookList类
public class BookList {
private Book[] books;
private int last = 0;
private int index = 0;
public BookList(int maxsize) {
this.books = new Book[maxsize];
}
public void appendBook(Book book) {
this.books[last] = book;
last++;
}
// 返回是否还有下一个元素
public boolean hasNext() {
return index < last;
}
// 返回当前元素,指针指向下一个元素
public Book next() {
Book book = books[index];
index++;
return book;
}
}
测试类:
@Test
public void test() {
BookList bl = new BookList(4);
bl.appendBook(new Book("a"));
bl.appendBook(new Book("b"));
bl.appendBook(new Book("c"));
bl.appendBook(new Book("d"));
while (bl.hasNext()) {
Book book = bl.next();
System.out.println(book.getName());
}
}
上面可以完成遍历,但是耦合度太高,应采用面向接口编程的思想编码。
修改后
Book.java实体类:
public class Book {
private String name;
public Book(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
Aggregate.java集合类接口,提供iterator方法定义:
public interface Aggregate {
Iterator iterator();
}
Iterator接口,提供next和hasNext方法的定义:
/**
* Iterator接口类
*/
public interface Iterator {
// 返回当前元素,指针指向下一个元素,Object返回类型更具有通用性
Object next();
// 是否有下一个元素
boolean hasNext();
}
BookList.java 作为Book类的集合,实现Aggregate接口:
// Book类集合
public class BookList implements Aggregate {
// 用数组存储元素
private Book[] books;
// 要新添加元素的索引,也是这个集合的长度
private int last = 0;
// 初始化数组长度
public BookList(int maxsize) {
this.books = new Book[maxsize];
}
// 向集合BookList中添加元素(也就是向books这个数组中添加元素)
public void appendBook(Book book) {
this.books[last] = book;
// 新增一个元素,长度加一
last++;
}
// 获取集合的长度
public int getLength() {
// 长度,不是索引
return last;
}
// 获取指定索引的元素
public Book getEleAt(int index) {
return this.books[index];
}
// 返回一个迭代器
@Override
public Iterator iterator() {
return new BookListIterator(this);
}
}
BookListIterator作为BookList迭代器的具体实现:
// BookList集合的迭代器
public class BookListIterator implements Iterator {
private BookList bookList;
private int index = 0;
public BookListIterator(BookList bookList) {
this.bookList = bookList;
}
// 返回当前元素
@Override
public Object next() {
Book book = bookList.getEleAt(index);
index++;
return book;
}
@Override
public boolean hasNext() {
// 当前比例的索引Index小于集合长度就有下一个元素
return index < this.bookList.getLength();
}
}
测试:
@Test
public void mainTest() {
BookList bookList = new BookList(4);
bookList.appendBook(new Book("d"));
bookList.appendBook(new Book("c"));
bookList.appendBook(new Book("b"));
bookList.appendBook(new Book("A"));
Iterator iterator = bookList.iterator();
while (iterator.hasNext()) {
Book book = (Book)iterator.next();
System.out.println(book.getName());
}
}