设计模式一:迭代器(Iterator)模式
Posted marcolin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式一:迭代器(Iterator)模式相关的知识,希望对你有一定的参考价值。
一、什么是迭代器模式
说白了就是一种遍历集合中元素的一种设计模式,我们赶紧先来看一下例子
二、实现举例
这里我们举一个例子,是将书(Book)放置到书架中(BookShelf),一个迭代器,我们总共要写2个接口,分别是一个集合接口(Agreegate),一个迭代器接口(Iterator),两个接口对应的实现类,以及要被遍历的对象对应的类
三、迭代器模式(Iterator)的实现步骤:
1.我们需要有一个集合接口,在这个接口里面定义一个Iterator方法,用于生成遍历集合的迭代器(Iterator)
1 package com.Maxwell07.IteratorMode.bookshelf; 2 3 /** 4 * 1.定义一个集合接口,用于生成遍历集合的Iterator 5 */ 6 7 public interface Aggregate { 8 public abstract Iterator iterator(); 9 }
2.写一个Iterator接口,Iterator接口包含hasNext和next的抽象方法
1 package com.Maxwell07.IteratorMode.bookshelf; 2 /** 3 * 2.写一个Iterator接口,Iterator接口包含hasNext和next的抽象方法 4 */ 5 6 public interface Iterator { 7 public abstract boolean hasNext(); 8 public abstract Object next(); 9 }
3.写一个要被遍历的类,这里我们写一个Book
package com.Maxwell07.IteratorMode.bookshelf; public class Book { private String name; public Book(String name) { this.name = name; } public String getName() { return name; } }
4.写一个集合的实现类,这里我们写一个实现了Aggreegate接口的BookShelf,它可以看做是Book的一个集合类
1 package com.Maxwell07.IteratorMode.bookshelf; 2 3 public class BookShelf implements Aggregate { 4 private Book[] books; 5 private int last = 0; 6 7 public BookShelf(int maxSize){ 8 this.books = new Book[maxSize]; 9 } 10 public Book getBookAt(int index){ 11 return books[index]; 12 } 13 14 public void appendBook(Book book){ 15 this.books[last] =book; 16 last++; 17 } 18 19 public int getLength(){ 20 return last; 21 } 22 //实现接口中的迭代器 23 @Override 24 public Iterator iterator() { 25 return new BookShelfIterator(this); 26 } 27 }
5.最后我们再写一个Iterator接口的实现类,也就是集合的迭代器,在这里我们把它命名为BookShelfIterator
package com.Maxwell07.IteratorMode.bookshelf; public class BookShelfIterator implements Iterator { private BookShelf bookShelf; private int index; public BookShelfIterator(BookShelf bookShelf) { this.bookShelf = bookShelf; this.index = 0; } //判断如果当前的index小于数组的长度,则返回true,否则返回false @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; } } 6.我们验证一下迭代器 package com.Maxwell07.IteratorMode.bookshelf; public class Main { public static void main(String[] args){ BookShelf bookShelf = new BookShelf(4); bookShelf.appendBook(new Book("三国演义")); bookShelf.appendBook(new Book("水浒传")); bookShelf.appendBook(new Book("西游记")); bookShelf.appendBook(new Book("红楼梦")); Iterator iterator = new BookShelfIterator(bookShelf); while (iterator.hasNext()) { Book book = (Book) iterator.next(); System.out.println("书架上有一本:"+book.getName()); } } }
文中的代码链接:https://github.com/Maxwell07/DesignMode/tree/master/src/com/Maxwell07/IteratorMode/bookshelf
四、为什么我们要用迭代器模式?
为了遍历集合,我们引入了一种这么复杂的设计模式,并且在写的时候容易出错,但是我们仔细想一下,引入迭代器以后,实际上我们把实现和遍历分开了,遍历并不会再依赖于实现。正如上面的例子,我们把数组换成集合,main函数中遍历的代买还是不需要再做修改
五、源码中的迭代器模式
//todo 待更新
以上是关于设计模式一:迭代器(Iterator)模式的主要内容,如果未能解决你的问题,请参考以下文章