迭代子模式又称Cursor模式,是对象的行为模式。迭代子模式可以顺序的访问聚集中的对象而不必显露聚集的内部表象。
在java中,聚集是指那些实现了java.util.Collection接口的对象。并且声明了一个Iterator接口,所有的Java聚集全都内部实现了相应ConcreteIterator。
白箱聚集/外禀迭代子:聚集自己实现迭代逻辑,并向外部提供宽接口。这样的话,可以从外部控制聚集的迭代过程。破坏了封装性。如图,可以从外部访问elements方法以及size属性(如果需要同时对几个不同的聚集对象进行迭代时,而且聚集对象提供的迭代方式不同,这时候需要使用外禀迭代子模式):
黑箱聚集/内禀迭代子:聚集对象对迭代子对象实现宽接口,而为其它对象提供一个窄接口。在java中,通过将迭代子类设计为聚集类的内部类来放宽接口限制。如图所示(甚至可以不需要提供私有方法/属性):
优点:
- 迭代子模式简化了聚集的界面。
- 因为每一个聚集对象可以有多个迭代子对象,每个迭代子状态是独立的。
- 由于遍历算法被封装在迭代子角色里面,因此碟带的算法可以独立于聚集角色变化。
缺点:
- 迭代子模式给客户端一个聚集被顺序化的感觉。
- 迭代子给出的聚集元素没有类型特征。