- IteratorPattern在GoF的定义:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。
- 实现:遍历任何对象集合
- 同时:降低类之间的耦合度,提高复用性
- 相关Pattern: Visitor Pattern, Composite Pattern,Factory Method Pattern(有时会用到)
- JDK中使用了Iterator pattern的类有:iterator
- 通过Iterator,借助在ConcreteInterator中定义的实现,在遍历Entity对象组成的集合时达到了屏蔽ConcreateAggregate中具体实现的目的,自然就降低了类之间的耦合度,提高了复用率。不论ConcreteAggregate中Entity的集合是List或者是Vector,或是Entity[],对于外界调用者来说都没有任何影响。
在Iterator pattern之上遍历集合对象时,调用实现变得十分通用:
// ---code----
ConcreteAggregate object = new ConcreteAggregate();
Iterator iterator = object.createIterator();
while(iterator.hasNext())
{
Object entity = iterator.next();
........
}
- Aggregate和Iterator类能不能改写成Interface而不使用Abstract Class ?
Aggregate类不能改写为Interface,因为在Aggregate中实现了createIterator()方法,
如果改写成Interface将不能在Aggregate中实现createIterator(),createIterator()的
实现就必须放在ConcreteAggregate中,显然,这样做是十分多余而且是违背所谓的
OO原则的。
Iterator类不能改写为Interface的理由与Aggregate不能改写为Interface是一样的,
Iterator中肩负着实现hashNext()的使命。
当然,Iterator与Aggregate是有不同之处的,Iterator肩负的任务并没有Aggregate那样重,
因为就方法hasNext()和next()所完成的业务而言,Iterator和ConcreteIterator之间是一致的。
而方法CreateIterator()如果放在ConcreteAggregate而言,就是纯粹的浪费了。