基本概念
迭代器模式,提供一种方法以便顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。迭代器为遍历聚集结构提供了如开始、下一个、是否结束、当前项等统一接口。
结构图
上图摘自《大话设计模式》
应用场景
当需要访问一个聚合对象,而且不管这些对象是什么,都需要遍历的时候,应该考虑迭代器模式。
源码示例
1.定义一个迭代器接口
package com.spook.iterator; /** * 迭代器接口 */ public interface Iterator { public Object first(); public Object next(); public Object currentItem(); public boolean hasNext(); public boolean isDone(); }2.定义一个抽象聚集接口
package com.spook.iterator; /** * 抽象聚集接口 */ public interface Aggregate { public Iterator getIterator(); }3.定义一个迭代器的实现类
package com.spook.iterator; /** * 迭代器的实现类 */ public class ConcreteIterator implements Iterator { public String cityNames[] = { "NewYork", "London", "Tokyo", "Hongkong" }; int index = 0; @Override public Object first() { // TODO Auto-generated method stub if (cityNames.length > 0) { return cityNames[0]; } else { return null; } } @Override public Object next() { // TODO Auto-generated method stub if (this.hasNext()) { return cityNames[index++]; } else { return null; } } @Override public Object currentItem() { // TODO Auto-generated method stub if (index < cityNames.length) { return cityNames[index]; } else { return null; } } @Override public boolean isDone() { // TODO Auto-generated method stub if (index >= cityNames.length) { return true; } else { return false; } } @Override public boolean hasNext() { // TODO Auto-generated method stub if (index < cityNames.length) { return true; } else { return false; } } }4.聚集的实现类
package com.spook.iterator; /** * 聚集的实现类 */ public class ConcreteAggregate implements Aggregate { @Override public Iterator getIterator() { // TODO Auto-generated method stub return new ConcreteIterator(); } }5.测试类
package com.spook.iterator; /** * 测试类 */ public class Test { public static void main(String[] args) { // TODO Auto-generated method stub ConcreteAggregate concreteAggregate = new ConcreteAggregate(); Iterator iterator = concreteAggregate.getIterator(); System.out.println("第一个元素:" + iterator.first()); System.out.println("---------------------"); while (iterator.hasNext()) { System.out.println(iterator.next()); System.out.println("是否完成遍历:" + iterator.isDone()); } } }运行测试类输出如下内容:
第一个元素:NewYork --------------------- NewYork 是否完成遍历:false London 是否完成遍历:false Tokyo 是否完成遍历:false Hongkong 是否完成遍历:true