zoukankan      html  css  js  c++  java
  • 设计模式(一)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模式的类图。

    儿女情长什么的,最影响我们闯荡江湖了。
  • 相关阅读:
    多线程---同步函数的锁是this(转载)
    函数
    流程控制
    基本语句和运算
    基本数据库类型
    迷宫问题
    Dungeon Master(逃脱大师)-BFS
    HTML元素常用属性整理
    Java_hutool 发起请求
    jQuery Autocomplete
  • 原文地址:https://www.cnblogs.com/BigJunOba/p/8666360.html
Copyright © 2011-2022 走看看