脚本宝典收集整理的这篇文章主要介绍了设计模式-01 迭代器模式,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
ITerator 中文对应迭代器,用于在数据集合中按照顺序遍历集合。
举一个最基本的遍历数组的例子:
public void MyStorage {
PRivate int[] arr;
// ...
public void iterateArr() {
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
类中的 iterate 方法非常完美地解决了遍历的任务,小巧精干。
但是:
为了解决这些问题,我们引入 Iterator 模式。
public interface Aggregate {
Iterator iterator();
}
public interface Iterator {
boolean hasNext();
Object next();
}
public class BookShelf implements Aggregate {
private Book[] books;
private int last;
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;
}
@override
public Iterator iterator() {
return new BookShelfIterator(this);
}
}
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 (index < bookShelf.getLength()) {
return true;
} else {
return false;
}
}
@Override
public Object next() {
Book book = bookShelf.getBookAt(index);
index++;
return 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 + ''' +
'}';
}
}
Client 要想遍历 BookShelf,只需要调用后者的 iterator 方法,获得 BookShef 的迭代器,然后使用迭代器进行迭代。不止对 BookShelf 这样进行迭代操作,用户对凡是实现了 Aggregate 接口的集合进行迭代,都是如此。在这个过程中:
ArrayList<Book>
实现书本的存储,只需要增加一个新的、实现了 Iterator 接口的迭代器,并且在这个迭代器中编写遍历 ArrayList 的具体实现,最后在 BookShelf 的 Iterator 方法中返回新的迭代器即可。因为更换数据存储结构,而对 BookShelf 产生的影响只有一行代码的修改(甚至可以直接用新的迭代器替换掉原来的 BookShelfIterator,实现 0 代码修改),符合 OCP 原则。这是更为一般的迭代器模式:
回到一个设计模式共性的问题:为什么这么麻烦?既然是一个数组,直接遍历处理就是最好的操作,似乎根本没有引入 Iterator 的必要。
如果 BookShelf 改用 java.util.List 管理书本,Client 使用 Iterator 进行迭代的操作代码不需要任何变动:
while (iterator.hasNext()) {
Book book = (Book) iterator.next();
System.out.println(book.getName())
}
设计模式的作用之一就是帮助我们编写可复用的类,而所谓的可复用就是当一个组件(类)发生变化时,不需要对其他组件进行改动,或者是进行很小的改动就能应对新的变化和需求。这也进一步解释了,在 BookShelf 的 iterator 方法中返回的是一个 Iterator 而不是 BookShelfIterator。
以往,我们更喜欢使用具体的类来解决具体的问题,这是一种务实的做法,但具体类的编写往往会造成强的关联和耦合,设计模式的任务之一,就是要降低组件或者说代码之间的耦合。
一个 concreteAggregate 可以对应多个 Concreteiterator,可以从前往后迭代,也可以从后往前迭代……
以上是脚本宝典为你收集整理的设计模式-01 迭代器模式全部内容,希望文章能够帮你解决设计模式-01 迭代器模式所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。