Fork me on Gitee

迭代器设计模式

Iterator 模式

我们在学习数组的时候,想要拿到数组的内容,避免少用不了循环语句犹如下面的语句

实际上拿到拿到每一个数据项的同时,就是依次访问数组中的元素,arr[0],arr[1]等

UML(单纯实现一个放书过程)

  • 两个顶层接口 Aggregate 生成iterator Iterator 接口 用于具体的实例用到的方法
  • bookshelf 主要返回一个本省的一个迭代器实例
  • bookshelftiterator 是实现book过程iterator的主要接口
  • book 一个普通的书实体类

主要code

  • 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 + "]";
   }
}

  • Aggregate interface

 public interface Aggregate {
   public abstract Iterator iterator();
}

public interface Iterator {
    public abstract boolean hasNext();
    public abstract Object next();
}
  • BookShelf
public class BookShelf implements Aggregate{
   private Book [] books;
   private int last=0;//指针
   
   public BookShelf(int size) {
      this.books=new Book[size];
   }
    
   public Book getBook(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);
   }
}
  • BookShelfIterator
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 (this.index < bookshelf.getLength()) {
            return true;
        } else {
            return false;
        }
    }
    @Override
    public Object next() {
        Book book = bookshelf.getBook(index);//指针
        index++;
        return book;
    }

}
  • 测试类 Main
public class Main1 {
    public static void main(String[] args) {
        BookShelf bookShelf = new BookShelf(3);
        bookShelf.appendBook(new Book("a"));
        bookShelf.appendBook(new Book("b"));
        bookShelf.appendBook(new Book("c"));
        Iterator it = (Iterator) bookShelf.iterator();
        while(it.hasNext()) {
            System.out.println(it.next());
        }
    }
}

role 作用

  • iterator : 负责遍历元素的接口 ,hasnext()用于判断是否存在下一个 next() 用于取出下一个
  • concreteiterator : 具体的实现类,booksheftiterator 包含了由bookiterator返回的所有信息.
  • bookshelt :一个是作为数据的容器因为本省继承了aggregate接口,另一个是作为产生当前实例迭代器的一个总的实例对象.他们同时在内部需要维护一个指针.
  • concreteAggregate: 创建出具体的iterator对象,例子中由于booksheft扮演这个角色.
  • 总结表格
    | Aggregate | 集合接口 >>可用java本省提供的代替
    | Book | 普通实体类
    | BookShelf |代表书架
    | BookShelfIterator | 代表书架的迭代期
    | Iterator | 遍历接口>>也可以用本身的代替
    | Main1 | 测试类

需要理解的重点知识

  1. 生成的iterator实例并不依赖与具体的迭代器实现,在我们维护的booksheftiterator 中只要能够保证booksheft返回的实例是正确的,那么程序就会执行下去.说简单点我们针对 Iterator进行有效的编程.
    2.维护的booksheft的Iteraotr 中next() 是指返回当前值,并且指向下一个值
    3.hasnext()是"最后一个"保证在while循环中能够正确的去执行.
    4.如果需要多个迭代期,在顶层接口集合中Aggregate增加即可
    5.如果你使用java编写那么不需要deleteiterator
  2. 例子中是使用的数组保存数据,我们可以使用java中已经维护好的数据结构进行操作
    7.可以使用java已经为我们提供好的一些接口实现

相关模式

  • vistor 模式: 与迭代器最大的不同是对于每次拿到的数据要进行固定的处理
  • Factory Method模式: 生成实例过程中可能会用到的工厂模式
posted @ 2018-04-08 22:36  ---dgw博客  阅读(162)  评论(0编辑  收藏  举报