迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
当你需要访问一个聚集对象,而且不管这些对象是什么都要遍历时,或者对聚集有多种方式遍历时,应该考虑用迭代器模式。为遍历不要的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。【互相组合】
/**
* 聚集接口
*
* @author administrator
*
* @param <T>
*/
public interface Aggregate<T> {
public Iterator<T> createIterator();
}
/**
* 迭代器接口
*
* @author administrator
*
* @param <T>
*/
public interface Iterator<T> {
public T first();
public T next();
public boolean isDone();
public T currentItem();
}
/**
* 具体聚集类
*
* @author administrator
*
* @param <T>
*/
public class ConcreteAggregate<T> implements Aggregate<T> {
private List<T> items = new ArrayList<T>();
@Override
public Iterator<T> createIterator() {
// TODO Auto-generated method stub
return new ConcreteIterator<T>(this);
}
public int count() {
return items.size();
}
public T getItems(int index) {
return items.get(index);
}
public void setItems(T item) {
items.add(item);
}
}
/**
* 具体迭代器类,给出一种具体迭代的实现方式。思考:迭代器表示的是一种迭代的行为,而聚集则是真正要被迭代的数据集合。
* 之所以要将迭代器和聚集分开,就是为了将行为与数据分开。 可类比Java中Iterator与Iterable的关系进行理解
*
* @author administrator
*
* @param <T>
*/
public class ConcreteIterator<T> implements Iterator<T> {
private ConcreteAggregate<T> concreteAggregate;
private int current = 0;
public ConcreteIterator(ConcreteAggregate<T> concreteAggregate) {
this.setConcreteAggregate(concreteAggregate);
}
@Override
public T first() {
return concreteAggregate.getItems(0);
}
@Override
public T next() {
current++;
if (current < concreteAggregate.count()) {
return concreteAggregate.getItems(current);
}
return null;
}
@Override
public boolean isDone() {
return current >= concreteAggregate.count() ? true : false;
}
@Override
public T currentItem() {
return concreteAggregate.getItems(current);
}
public ConcreteAggregate<T> getConcreteAggregate() {
return concreteAggregate;
}
public void setConcreteAggregate(ConcreteAggregate<T> concreteAggregate) {
this.concreteAggregate = concreteAggregate;
}
public int getCurrent() {
return current;
}
public void setCurrent(int current) {
this.current = current;
}
}
/**
* 迭代器客户端
*
* @author administrator
*
*/
public class IteratorClient {
public static void main(String[] args) {
ConcreteAggregate<String> bus = new ConcreteAggregate<String>();
bus.setItems("大鸟");
bus.setItems("小菜");
bus.setItems("行李");
bus.setItems("老外");
bus.setItems("公交内部员工");
bus.setItems("小偷");
Iterator<String> iterator = new ConcreteIterator<String>(bus);
while (!iterator.isDone()) {
System.out.println(iterator.currentItem() + "请买票!");
iterator.next();
}
}
}