Design Patterns(十五) Iterator
Iterator pattern is very commonly used design pattern in Java and .Net programming environment. This pattern is used to get a way to access the elements of a collection object in sequential manner without any need to know its underlying representation.
前言 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
迭代器模式 基本介绍:
1) 迭代器模式(Iterator Pattern)是常用的设计模式,属于行为型模式; 2) 如果我们的 集合 元 素是用不同的方式实现 的,有数组,还有java的集合类,或者还有其他方式,当客户端要 遍历这 些 集合 元 素 的时候就要使用多种遍历方式,而且还会暴露元素的内部结构,可以考虑使用迭代器模式解决; 3) 迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即:不暴露其内部的结构。
角色介绍:
1)Iterator(迭代器)迭代器定义访问和遍历元素的接口; 2)ConcreteIterator (具体迭代器)具体迭代器实现迭代器接口对该聚合遍历时跟踪当前位置; 3)Aggregate (聚合)聚合定义创建相应迭代器对象的接口; 4)ConcreteAggregate (具体聚合)具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。
迭代器模式-UML图:
迭代器模式-实例图:
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 import java.util.ArrayList;import java.util.List;public class IteratorDemo { public static void main (String[] args) { BookShelf bookShelf = new BookShelf(); bookShelf.appendBook(new Book("Around the World in 80 Days" )); bookShelf.appendBook(new Book("Bible" )); bookShelf.appendBook(new Book("Cinderella" )); bookShelf.appendBook(new Book("Daddy-Long-Legs" )); Iterator it = bookShelf.iterator(); while (it.hasNext()) { Book book = (Book) it.next(); System.out.println(book.getName()); } } } interface Aggregate { public abstract Iterator iterator () ; } interface Iterator { public abstract boolean hasNext () ; public abstract Object next () ; } class Book { private String name; public Book (String name) { this .name = name; } public String getName () { return name; } } class BookShelf implements Aggregate { private List<Book> books; public BookShelf () { this .books = new ArrayList<Book>(); } public Book getBookAt (int index) { return books.get(index); } public void appendBook (Book book) { books.add(book); } public int getLength () { return books.size(); } public Iterator iterator () { return new BookShelfIterator(this ); } } class BookShelfIterator implements Iterator { private BookShelf bookShelf; private int index; public BookShelfIterator (BookShelf bookShelf) { this .bookShelf = bookShelf; this .index = 0 ; } public boolean hasNext () { if (index < bookShelf.getLength()) { return true ; } else { return false ; } } public Object next () { Book book = bookShelf.getBookAt(index); index++; return book; } }
总结 迭代器模式的注意事项和细节:
优 点
1) 提供一个统一的方法遍历对象,客户不用再考虑聚合的类型,使用一种方法就可以遍历对象了; 2) 隐藏了聚合的内部结构,客户端要遍历聚合的时候只能取到迭代器,而不会知道聚合的具体组成; 3) 提供了一种设计思想,就是一个类应该只有一个引起变化的原因(叫做 单一责任原则 )。在聚合类中,我们把迭代器分开,就是要把管理对象集合和遍历对象集合的责任分开,这样一来集合改变的话,只影响到聚合对象。而如果遍历方式改变的话,只影响到了迭代器; 4) 当要展示一组相似对象,或者遍历一组相同对象时使用, 适合使用迭代器模式。
缺 点 每个聚合对象都要一个迭代器,会生成多个迭代器不好管理类。
延伸 迭代器模式 迭代器模式-菜鸟教程 迭代器模式简析 Design Patterns - Iterator Pattern 尚硅谷Java设计模式,韩顺平图解java设计模式
<
Design Patterns(十六) Observer
Design Patterns(十四) Visitor
>