设计模式(迭代器模式)
第一章 设计模式之迭代器模式(iterator)
一、iterator模式介绍
使用java语言遍历数组时通常使用如下代码:
for (int i = 0; i < array.length; i++) {
system.out.println(array[i]);
}
将上面的循环变量i的作用抽象化、通用化后形成的模式,在设计模式中成为Iterator模式。
Iterator模式用于在数据集合中按照顺序遍历集合
二、示例程序
首先,让我们来看一段Iterator模式的示例程序,该段程序的作用是将书(Book)放置在(BookShelf)中,
并将书的名字顺序显示出来。
1.示例程序的示意图
2.示例程序类图
3.Aggregate接口
public interface Aggregate {
public abstract Iterator iterator();
}
在Aggregate接口中只有一个iterator方法,该方法用于生成一个遍历集合的迭代器。
4.Iterator接口
public interface Iterator {
public abstract boolean hasNext();
public abstract Object next();
}
hashNext()返回值为bool值,用于判断是否存在下一个元素。
next()方法返回类型为object,用于返回集合中的元素。
5.Book类
public class Book {
private String name;
public Book(String name) {
this.name = name;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
'}';
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
6.BookSelf类
public class BookSelf implements Aggregate {
private ArrayList<Book> books;
private int length = 0;
public BookSelf(int size) {
this.books = new ArrayList<>(size);
}
public Book getBookAt(int index) {
return this.books.get(index);
}
public void appendBook(Book book) {
length++;
this.books.add(book);
}
public int getLength() {
return length;
}
@Override
public Iterator iterator() {
return new BookSelfIterator(this);
}
}
BookSelf中定义了books字段,用于存储Book类。
iterator()方法会生成BookSelfIterator类的实例作为BookSelf对应的Iterator,
当外部想要遍历这个书架,就需要调用这个方法。
7.BookSelfIterator类
public class BookSelfIterator implements Iterator {
private BookSelf bookSelf;
private int index = 0;
public BookSelfIterator(BookSelf bookSelf) {
this.bookSelf = bookSelf;
}
@Override
public boolean hasNext() {
if (index < bookSelf.getLength()) {
return true;
} else {
return false;
}
}
@Override
public Object next() {
Book book = bookSelf.getBookAt(index);
index++;
return book;
}
}
因为BookSelfIterator类需要发挥Iterator的作用,所以需要实现Iterator接口。
BookSelf表示需要遍历的书架,index表示迭代器当前遍历的下标。
8.Main类
public class Main {
public static void main(String[] args) {
BookSelf bookSelf = new BookSelf(10);
bookSelf.appendBook(new Book("水浒传"));
bookSelf.appendBook(new Book("西游记"));
bookSelf.appendBook(new Book("红楼梦"));
bookSelf.appendBook(new Book("三国演义"));
Iterator iterator = bookSelf.iterator();
while (iterator.hasNext()) {
Book book = (Book) iterator.next();
System.out.println(book.getName());
}
}
}