1、模式说明设计模式
迭代操做在程序开发中很常见:在数据集合中按顺序便利全部元素(例如:遍历一个数组中的全部元素),将遍历时使用的索引(如访问数组循环变量i)抽象化、通用化后造成的模式就是迭代器模式。数组
核心的迭代器通常包含两个方法:hasNext()和next()方法,前一个方法用于判断集合中是否还存在下一个须要迭代的元素,返回值类型是Bool类型;next()方法用于返回集合中一个元素,而且将迭代器移动到下一个元素。app
该模式的UML图和示例代码UML图以下:ide
迭代模式的UML很简单,包含两个接口:Aggregate接口和Iterator接口,对应ConcreteAggregate角色和ConcreteIterator角色。this
上图中,设计两个接口,而没有只使用一个Iterator接口,缘由在于咱们须要将“遍历功能”独立于ConcreteAggregate角色以外,这样就能够针对一个ConcreteAggregate角色编写多种不一样的ConcreteIterator角色(从前向后遍历、从后向前遍历previous、跳跃遍历)。spa
2、模式中的角色:设计
3、模式代码示例:code
(代码分为两个包,patterndesign包用于设计模式的代码实现,patterndemostrate用于模式代码的使用实例说明)blog
代码结构:索引
模式相关代码:
Aggregrate接口:
package com.designpattern.cn.iteratorpattern.patterndesign; public interface Aggregate { public abstract Iterator iterator(); }
Iterator接口:
package com.designpattern.cn.iteratorpattern.patterndesign; public interface Iterator { public abstract boolean hasNext(); public abstract Object next(); }
模式实现演示:
Book书籍类:
package com.designpattern.cn.iteratorpattern.patterndemostrate; public class Book { private String name; public Book(String name){ this.name = name; } public String getName() { return name; } }
BookShelf书架类(相似模拟一个集合类):
package com.designpattern.cn.iteratorpattern.patterndemostrate; import com.designpattern.cn.iteratorpattern.patterndesign.Aggregate; import com.designpattern.cn.iteratorpattern.patterndesign.Iterator; public class BookShelf implements Aggregate { private Book books[]; private int last = 0; public BookShelf(int size){ this.books = new Book[size]; } 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); } }
迭代器类(实现了书架类(模拟集合)中元素的迭代):
package com.designpattern.cn.iteratorpattern.patterndemostrate; import com.designpattern.cn.iteratorpattern.patterndesign.Iterator; public class BookShelfIterator implements Iterator { private BookShelf bookShelf; private int index; public BookShelfIterator(BookShelf bookShelf){ this.bookShelf = bookShelf; this.index = 0; } public boolean hasNext(){ return index < bookShelf.getLength(); } public Object next(){ Book book = bookShelf.getBookAt(index); index++; return book; } }
运行结果:
4、相关的模式
此随笔参照中国工信出版集团,人民邮电出版社的《图解设计模式》梳理。