一、概念
迭代器是针对集合对象而生的,对于集合对象而言,必然涉及到集合元素的添加删除操作,同时也肯定支持遍历集合元素的操作,我们此时可以把遍历操作也放在集合对象中,但这样的话,集合对象就承担太多的责任了,面向对象设计原则中有一条是单一职责原则,所以我们要尽可能地分离这些职责,用不同的类去承担不同的职责。迭代器模式就是用迭代器类来承担遍历集合元素的职责。分离集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据。
二、实现
迭代器模式由以下部分组成:
迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口
具体迭代器角色(ConcreteIteraror):具体迭代器角色实现了迭代器接口,并需要记录遍历中的当前位置。
集合角色(Aggregate):聚合角色负责定义获得迭代器角色的接口
具体集合角色(ConcreteAggregate):具体聚合角色实现聚合角色接口。
具体迭代器:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 | public class ConcreteIterator implements Iterator { private ConcreteAggregate objects; public ConcreteIterator(ConcreteAggregate objects) { this .objects=objects; } public void first() { ...... } public void next() { ...... } public boolean hasNext() { ...... } public Object currentItem() { ...... } } |
具体集合:
1 2 3 4 5 6 7 8 9 | public class ConcreteAggregate implements Aggregate { ...... public Iterator createIterator() { return new ConcreteIterator( this ); } ...... } |
三、优缺点
迭代器模式的优点有:
1.简化了遍历方式,对于对象集合的遍历,还是比较麻烦的,对于数组或者有序列表,可以通过游标来取得,自行遍历对象,但是对于hash表来说,遍历起来就麻烦了。迭代器用起来就简单的多了。
2.可以提供多种遍历方式,比如说对有序列表,我们可以根据需要提供正序遍历,倒序遍历两种迭代器,用户用起来只需要得到我们实现好的迭代器,就可以方便的对集合进行遍历了。
3.封装性良好,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心。
迭代器模式的缺点:
对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐,大家可能都有感觉,像ArrayList,我们宁可愿意使用for循环和get方法来遍历集合。