一、定义

提供一种方式顺序地访问一个聚合对象中的各个元素,而又不暴露此对象的内部表示。

二、类图表示

迭代器模式

三、实现

1、Aggregate

package pattern.behavioral.iterator;

public abstract class Aggregate {

	public abstract Iterator createIterator();
}


package pattern.behavioral.iterator;

import java.util.ArrayList;
import java.util.List;

public class ConcreteAggregate extends Aggregate {

	private List<Object> items = new  ArrayList<>();
	
	@Override
	public Iterator createIterator() {
		return new ConcreteIterator(this);
	}

	public int count(){
		return items.size();
	}
	
	public Object get(int index){
		return items.get(index);
	}
	
	public void add(int index, Object element){
		items.add(index, element);
	}
}

2、Iterator

package pattern.behavioral.iterator;

public abstract class Iterator {

	public abstract Object first();
	public abstract Object next();
	public abstract boolean isDone();
	public abstract Object currentItem();
}


package pattern.behavioral.iterator;

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.get(0);
	}

	@Override
	public Object next() {
		if(current < aggregate.count() - 1){
			return aggregate.get(++current);
		}
		return null;
	}

	@Override
	public boolean isDone() {
		return current >= aggregate.count();
	}

	@Override
	public Object currentItem() {
		return aggregate.get(current);
	}

}

四、使用

package pattern.behavioral.iterator;

public class Client {

	public static void main(String[] args) {
		ConcreteAggregate aggregate = new ConcreteAggregate();
		aggregate.add(0, "ItemA");
		aggregate.add(1, "ItemB");
		aggregate.add(2, "ItemC");
		aggregate.add(3, "ItemD");
		
		ConcreteIterator iterator = new ConcreteIterator(aggregate);
		System.out.println("The first element is :" + iterator.first());
		
		while(iterator.next() != null){
			System.out.println(iterator.currentItem());
		}
	}
}
  • 程序输出:
The first element is :ItemA
ItemB
ItemC
ItemD

五、适用场合

  • 访问一个聚合对象的内容而无需暴露其内部表示

  • 支持对聚合对象的多种遍历

  • 为遍历不同的聚合结构提供统一的接口