迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露对象内部表示。
迭代器模式
迭代器模式 Iterator[ɪtə'reɪtə] Pattern
:又称为游标 Cursor
模式,是非常古老的设计模式,主要用于对容器的遍历访问,当前高级面向对象语言基本上默认包含这个模式。
类图结构
结构解析
Iterator
接口,定义迭代器的基本方法。
ConcreteIterator
实现类,实现迭代器的方法。
Aggregate
抽象类,容器类,存储数据并创建迭代器。
ConcreteAggregate
实现类,容器的各个方法的实现,并完成具体迭代器的创建。
Client
客户端。
ConcreteIterator
和 ConcreteAggregate
耦合性很高。ConcreteAggregate
创建了 ConcreteIterator
实例,而 ConcreteIterator
持有 ConcreteAggregate
的引用,用于遍历容器中的数据。
迭代器模式结构图看起来很臃肿,使用起来并不方便,而分开的目的参考单一职责原理,Aggregate
负责容器中数据元素的维护,而 Iterator
负责遍历操作。
示例
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
| public interface Iterator { Object next(); boolean hasNext(); }
public abstract class Aggregate { public abstract Iterator createIterator(); public abstract void add(String string); public abstract void remove(String string); public abstract String get(int index); public abstract int size(); }
public class ConcreteIterator implements Iterator{ private Aggregate aggregate; private int index = 0;
public ConcreteIterator(Aggregate aggregate){ this.aggregate = aggregate; }
@Override public String next() { String next = null; if (hasNext()) { next = aggregate.get(index); index++; } return next; }
@Override public boolean hasNext() { return index < aggregate.size(); } }
public class ConcreteAggregate extends Aggregate{ private List<String> list = new ArrayList<>();
@Override public Iterator createIterator() { return new ConcreteIterator(this); }
@Override public void add(String string) { list.add(string); }
@Override public void remove(String string) { list.remove(string); }
@Override public String get(int index) { return list.get(index); }
@Override public int size() { return list.size(); } }
public class TestIterator { public static void main(String[] args) { Aggregate aggregate = new ConcreteAggregate(); aggregate.add("this"); aggregate.add("is"); aggregate.add("iterator"); aggregate.add("pattern");
Iterator iterator = aggregate.createIterator(); while (iterator.hasNext()){ System.out.print(iterator.next() + " "); } } }
this is iterator pattern
|
使用 List
数据结构来存放数据,它本身就实现了 Iterator
模式,这里只是举例来说明迭代器使用方法。
总结
Java
语言已经包含了迭代器接口 Interator
,在实际使用中仅仅需要实现 Collection
集合就能应用迭代器模式,其中 List, Map
等等都都是常见迭代器容器。而 Android
中 Cursor
也是典型的迭代器模式。
迭代器模式分离了集合对象的遍历行为,抽象一个迭代器类来负责遍历操作,这样既可以不用暴露集合内部的数据结构,又可以让外部代码非常透明的访问集合内部的数据。
参考文档