设计模式(一)Iterator模式

  Iterator模式用于在数据集合中按照顺序遍历集合。即迭代器模式。

  下面来看一段实现了迭代器模式的示例程序。

  这段程序的作用是将书(Book)放置到书架(BookShelf)中,并将书的名字按顺序显示出来。

  首先写一个Aggregate接口,这个接口是所要遍历的集合的接口。实现了该接口的类将成为一个可以保存多个元素的集合,就像数组一样。

  在Aggregate接口中声明的方法只有一个iterator()方法,该方法会生成一个用于遍历集合的迭代器。

1 package BigJunOba.bjtu.Iterator;
2 
3 public interface Aggregate {
4     public abstract Iterator iterator();
5 }

   接下来写一个Iterator接口。这里声明了两个方法,即判断是否存在下一个元素的hasNext方法,和获取下一个元素的next方法。

1 package BigJunOba.bjtu.Iterator;
2 
3 public interface Iterator {
4     public abstract boolean hasNext();
5     public abstract Object next();
6 }

  然后写一个Book类。它可以做的事情只有一件,那就是通过getName方法获取书的名字。书的名字是在外部调用Book类的构造函数并初始化Book类时,作为参数传递给Book类的。

package BigJunOba.bjtu.Iterator;

public class Book {
    
    private String name;

    public Book(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
    
}

  BookShelf类时表示书架的类。由于需要将该类作为集合进行处理,因此它实现了Aggregate接口。此外,还实现了Aggregate接口的iterator方法。

  这里要注意的是iterator方法,该方法会生成并返回BookShelfIterator类的实例作为BookShelf类对应的Iterator。当外部想要遍历书架时,就会调用这个方法。

 1 package BigJunOba.bjtu.Iterator;
 2 
 3 public class BookShelf implements Aggregate {
 4     
 5     private Book[] books;
 6     private int last = 0;
 7     
 8     public BookShelf(int maxsize) {
 9         this.books = new Book[maxsize];
10     }
11     
12     public Book getBookAt(int index) {
13         return books[index];
14     }
15     
16     public void appendBook(Book book) {
17         this.books[last] = book;
18         last++;
19     }
20     
21     public int getLength() {
22         return last;
23     }
24 
25     @Override
26     public Iterator iterator() {
27         return new BookShelfIterator(this);
28     }
29 
30 }

  BookShelfIterator类用于遍历书架。

 1 package BigJunOba.bjtu.Iterator;
 2 
 3 public class BookShelfIterator implements Iterator {
 4     
 5     private BookShelf bookShelf;
 6     private int index;
 7     
 8     public BookShelfIterator(BookShelf bookShelf) {
 9         this.bookShelf = bookShelf;
10         this.index = 0;
11     }
12 
13     @Override
14     public boolean hasNext() {
15         if (index < bookShelf.getLength()) {
16             return true;
17         } else {
18             return false;
19         }
20     }
21 
22     @Override
23     public Object next() {
24         Book book = bookShelf.getBookAt(index);
25         index++;
26         return book;
27     }
28 
29 }

  接下来使用Main类来制作一个小书架。

 1 package BigJunOba.bjtu.Iterator;
 2 
 3 public class Main {
 4     public static void main(String[] args) {
 5         BookShelf bookShelf = new BookShelf(4);
 6         bookShelf.appendBook(new Book("Around the World in 80 Days"));
 7         bookShelf.appendBook(new Book("Bible"));
 8         bookShelf.appendBook(new Book("Cinderella"));
 9         bookShelf.appendBook(new Book("Daddy Long Legs"));
10         Iterator it = bookShelf.iterator();
11         while (it.hasNext()) {
12             Book book = (Book) it.next();
13             System.out.println(book.getName());
14         }
15     }
16 }

  输出结果如下。

1 Around the World in 80 Days

2 Bible

3 Cinderella

4 Daddy Long Legs 

  示例程序类图和Iterator模式的类图。

  Iterator模式的类图。

 

posted @ 2018-03-29 10:26  BigJunOba  阅读(177)  评论(0编辑  收藏  举报