迭代器模式(Iterator pattern): 提供一种方法顺序访问一个聚合对象中的各个元素, 而又不暴露其内部的表示。
迭代器模式的详解
类图:
角色说明:
抽象迭代器角色(Iterator):此抽象角色定义出遍历元素所需的接口。
具体迭代器角色(ConcreteIterator):具体迭代器实现了Iterator接口,并保持迭代过程中的游标位置。
抽象集合角色(Collection):集合抽象角色给出创建迭代器对象的接口。
具体集合角色(ConcreteCollection):实现了创建迭代器对象的接口,返回一个适合的具体迭代器实例。
客户端角色(Client):持有对集合机器迭代器对象的应用,调用迭代器对象的迭代接口,也有可能通过迭代器操作集合元素的增加和删除。
代码演示,抽象迭代器类:
public interface Iterator {
/**
* 移动到第一个元素
*/
public void first();
/**
* 移动到下一个元素
*/
public void next();
/**
* 判断是否是最后一个元素
*/
public boolean isLast();
/**
* 获取当前元素
*/
public Object currentItem();
}
抽象集合类:
public abstract class Collection {
/**
* 给出创建迭代器对象的接口
*
* @return 返回迭代器
*/
public abstract Iterator createIterator();
}
具体集合类:
public class ConcreteCollection extends Collection {
private Object[] object = null;
/**
* 在构造的时候传入集合对象的内容
*
* @param object
*/
public ConcreteCollection(Object[] object) {
this.object = object;
}
/**
* 通过集合的索引向外部提供集合元素
*
* @param index
* 索引
* @return 索引值
*/
public Object getElement(int index) {
if (index < object.length) {
return object[index];
} else {
return null;
}
}
/**
* 返回集合的长度
*
* @return
*/
public int size() {
return object.length;
}
@Override
public Iterator createIterator() {
// TODO Auto-generated method stub
return new ConcreteIterator(this);
}
}
具体迭代器类:
public class ConcreteIterator implements Iterator {
//被迭代的集合对象
private ConcreteCollection collection;
// 索引位置值
private int index = 0;
// 集合对象的大小
private int size = 0;
public ConcreteIterator(ConcreteCollection collection) {
this.collection = collection;
this.size = collection.size();
index = 0;
}
@Override
public void first() {
// 把索引修改成指定第一个元素
index = 0;
}
@Override
public void next() {
// 索引移动到下一个元素
if (index < size) {
index++;
}
}
@Override
public boolean isLast() {
// 判断是否为最后一个元素
return (index >= size);
}
@Override
public Object currentItem() {
// 返回当前元素
return collection.getElement(index);
}
}
客户端测试类:
public class Client {
public static void main(String[] args) {
Object[] object = { "MON", "TUE", "WED", "THU", "FRI", "SAT" ,"SUN"};
// 创建集合对象
Collection collection = new ConcreteCollection(object);
// 迭代出集合中的值
Iterator iterator = collection.createIterator();
while (!iterator.isLast()) {
System.out.println(iterator.currentItem());
iterator.next();
}
}
}
运行结果:
迭代器模式的使用场景
- 访问一个聚合对象的内容而无需暴露它的内部表示
- 支持对聚合对象的多种遍历
- 为遍历不同的聚合结构提供一个统一的接口。
迭代模式的优点:
- 简化了遍历方式,对于数组或者有序列表,我们是可以通过游标来获得的。但是用户需要在对集合了解很清楚的情况下,执行遍历对象。但是对于hash表来说,遍历起来还是比较繁琐的。而引入迭代器方法后,操作起来就简单多了。
- 可以实现多种遍历方式,比如有序列表,可以想办法实现正反两种迭代的顺序。操作起来只需要得到迭代器对象就可以进行对集合的遍历。
- 封装性良好,客户端只需要得到迭代器就可以进行操作,而对于遍历算法则不用关心。
缺点:
- 对于简单的遍历(像数组或有序列表),使用迭代器方式遍历还是较为繁琐的。这种情况下使用for循环更为方便。