迭代器模式也叫游标模式,提供一种方法可以访问逐一访问容器里面的每个对象,又不暴露各个对象的内部细节。
迭代器模式分为下面几个角色:
- 迭代器角色:定义访问和遍历容器内元素的接口;
- 具体迭代器:迭代器角色的具体实现,并保存迭代器中的位置;
- 聚集角色:给出创建迭代器对象的接口;
- 具体聚集角色:聚集角色的实现,并返回一个迭代器对象的实例。
迭代器角色:
public interface Iterator {
public Object first();
public Object next();
public Object currentObject();
}
具体迭代器角色:
public class ConcreteIterator implements Iterator {
public ConcreteAggregate soldier;
public int currentItem = -1;
public ConcreteIterator(ConcreteAggregate soldier) {
super();
this.soldier = soldier;
}
@Override
public Object first() {
if(soldier.lists.size() > 0) {
return soldier.lists.get(0);
}
return null;
}
@Override
public Object next() {
if(currentItem < soldier.lists.size() - 1) {
currentItem++;
if(currentItem > soldier.lists.size() - 1) {
currentItem = 0;
}
return soldier.lists.get(currentItem);
}
return null;
}
@Override
public Object currentObject() {
return soldier.lists.get(currentItem);
}
}
聚集角色:
public abstract class Aggregate {
public abstract Iterator createIterator();
}
具体聚集角色:
public class ConcreteAggregate extends Aggregate {
public List<String> lists = new ArrayList<String>();
@Override
public Iterator createIterator() {
return new ConcreteIterator(this);
}
public void addObject(String str) {
lists.add(str);
}
}
测试:
public static void main(String[] args) {
ConcreteAggregate concreteAggregate = new ConcreteAggregate();
concreteAggregate.addObject("1");
concreteAggregate.addObject("2");
concreteAggregate.addObject("3");
concreteAggregate.addObject("4");
concreteAggregate.addObject("5");
Iterator iterator = concreteAggregate.createIterator();
System.out.println(iterator.first());
System.out.println("------");
for(int i = 0; i < concreteAggregate.lists.size(); i++) {
System.out.println(iterator.next());
}
System.out.println("------");
System.out.println(iterator.currentObject());
}