一,定义
迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
迭代器模式的实用价值远不如他的学习价值大,因为很多语言已经把他封装好了。
二,示例
/**
* @类描述:抽象迭代器接口
*/
public abstract class Iterator {
public abstract Object first();
public abstract Object next();
public abstract boolean isDone();
public abstract Object currentItem();
}
/**
* @类描述:具体迭代实现
*/
public class ConcreteIterator extends Iterator {
private ConcreteAggregate aggregate;
private int current = 0;
public ConcreteIterator(ConcreteAggregate aggregate){
this.aggregate = aggregate;
}
@Override
public Object first() {
return aggregate.getIndex(0);
}
@Override
public Object next() {
Object ret = null;
current++;
if (current < aggregate.getCount()){
ret = aggregate.getIndex(current);
}
return ret;
}
@Override
public boolean isDone() {
return current >= aggregate.getCount() ? true : false;
}
@Override
public Object currentItem() {
return aggregate.getIndex(current);
}
}
/**
* @类描述:聚集抽象类
*/
abstract class Aggregate {
public abstract Iterator createIterator();
}
public class ConcreteAggregate extends Aggregate {
private List<Object> items = new ArrayList<>();
@Override
public Iterator createIterator() {
return new ConcreteIterator(this);
}
public int getCount(){
return items.size();
}
public Object getIndex(int index){
return items.get(index);
}
public void add(Object obj){
items.add(obj);
}
public void remove(Object obj){
items.remove(obj);
}
}
//test main
//迭代器模式
public static void iteratorModel(){
ConcreteAggregate aggregate = new ConcreteAggregate();
aggregate.add("大鸟");
aggregate.add("小菜");
aggregate.add("行李");
aggregate.add("老外");
aggregate.add("公交内部员工");
aggregate.add("小偷");
Iterator iterator = aggregate.createIterator();
while (!iterator.isDone()){
System.out.println(iterator.currentItem() + "请买票!");
iterator.next();
}
}
输出结果:
大鸟请买票!
小菜请买票!
行李请买票!
老外请买票!
公交内部员工请买票!
小偷请买票!
三,总结
迭代器模式的优点:
- 简化了遍历方式,对于对象集合的遍历,还是比较麻烦的,对于数组或者有序列表,我们尚可以通过游标来取得,但用户需要在对集合了解很清楚的前提下,自行遍历对象,但是对于hash表来说,用户遍历起来就比较麻烦了。而引入了迭代器方法后,用户用起来就简单的多了。
- 可以提供多种遍历方式,比如说对有序列表,我们可以根据需要提供正序遍历,倒序遍历两种迭代器,用户用起来只需要得到我们实现好的迭代器,就可以方便的对集合进行遍历了。
- 封装性良好,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心。
迭代器模式的缺点:
- 对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐,大家可能都有感觉,像ArrayList,我们宁可愿意使用for循环和get方法来遍历集合。
适用场景:
- 当你需要访问一个聚集对象,而且不管这些对象时什么都需要遍历的时候,你就可以考虑用迭代器模式。
迭代器模式是与集合共生共死的,一般来说,我们只要实现一个集合,就需要同时提供这个集合的迭代器,就像java中的Collection,List、Set、Map等,这些集合都有自己的迭代器。假如我们要实现一个这样的新的容器,当然也需要引入迭代器模式,给我们的容器实现一个迭代器。
但是,由于容器与迭代器的关系太密切了,所以大多数语言在实现容器的时候都给提供了迭代器,并且这些语言提供的容器和迭代器在绝大多数情况下就可以满足我们的需要,所以现在需要我们自己去实践迭代器模式的场景还是比较少见的,我们只需要使用语言中已有的容器和迭代器就可以了。
参考:《大话设计模式》 http://blog.csdn.net/zhengzhb/article/details/7610745