定义
提供一种遍历聚合对象的方式,而又不暴露该对象的内部表示。
- 聚合对象:存储数据
- 迭代器:遍历数据
当你需要访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,就需要考虑用迭代器模式,为遍历不同的聚合结构提供如第一个、下一个、是否结束、当前哪一个等统一的接口。
结构图
代码实现
- 定义迭代器接口MyIterator.java
/**
* User:tumbler
* Desc:迭代器模式--迭代器接口
* 定义获取第一个、下一个、是否有下一个元素、当前元素等方法
*/
public interface MyIterator {
/**
* 将游标指向第一个元素
*/
void first();
/**
* 将游标指向第下一个元素
*/
void next();
/**
* 是否有下一个元素
* @return
*/
boolean hasNext();
boolean isFirst();
boolean isLast();
/**
* 获取当前元素
* @return
*/
Object getCurrentObj();
}
- 自定义聚合类ConcreteMyAggregate.java ,使用内部类实现迭代器
/**
* User:tumbler
* Desc:迭代器模式--自定义聚合类,使用内部类实现迭代器
*/
public class ConcreteMyAggregate {
private List<Object> list = new ArrayList<>();
public void addObject(Object obj) {
this.list.add(obj);
}
public void removeObject(Object obj) {
this.list.remove(obj);
}
public List<Object> getList() {
return list;
}
public void setList(List<Object> list) {
this.list = list;
}
/**
* 获得迭代器
* @return
*/
public ConcreteIterator createIterator() {
return new ConcreteIterator();
}
/**
* 使用内部类定义迭代器,可以直接使用外部类的属性
*/
protected class ConcreteIterator implements MyIterator{
/**
* 定义游标,用于记录遍历时的位置
*/
private int cursor;
@Override
public void first() {
cursor = 0;
}
@Override
public void next() {
if (hasNext()){
cursor++;
}
}
@Override
public boolean hasNext() {
return cursor < list.size();
}
@Override
public boolean isFirst() {
return cursor == 0;
}
@Override
public boolean isLast() {
return cursor == (list.size() - 1);
}
@Override
public Object getCurrentObj() {
return list.get(cursor);
}
}
}
- 测试迭代器Client.java
/**
* User:tumbler
* Desc:迭代器模式--测试类
*/
public class Client {
public static void main(String[] args) {
ConcreteMyAggregate cma = new ConcreteMyAggregate();
cma.addObject("aa");
cma.addObject("bb");
cma.addObject("cc");
//获得迭代器进行遍历
MyIterator iter = cma.createIterator();
while (iter.hasNext()) {
System.out.println(iter.getCurrentObj());
iter.next();
}
}
}
运行结果:
aa
bb
cc
- UML图
开发常见应用
- JDK内置的迭代器(List/Set)