- 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
public abstract class Iterator {
public abstract Object first();
public abstract Object next();
public abstract Boolean isDone();
public abstract Object currentItem();
}
public abstract class Aggregate {
public abstract Iterator createIterator();
}
public class ConcreteAggregate extends Aggregate{
private List<Object> items = new ArrayList<>();
@Override public Iterator createIterator() {
return new ConcreteIterator(this);
}
public int getCount() {
return items.size();
}
public Object indexGet(int index){
return items.indexOf(index);
}
public void add(Object obj){
items.add(obj);
}
}
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.indexGet(0);
}
@Override public Object next() {
Object ret = null;
current++;
if (current < aggregate.getCount()) {
ret = aggregate.indexGet(current);
}
return ret;
}
@Override public Boolean isDone() {
return current >= aggregate.getCount() ? true : false;
}
@Override public Object currentItem() {
return this.current;
}
}
public class ConcreteIteratorDesc extends Iterator{
private ConcreteAggregate aggregate;
private int current = 0;
public ConcreteIteratorDesc(ConcreteAggregate aggregate) {
this.aggregate = aggregate;
current = aggregate.getCount()-1;
}
@Override public Object first() {
return aggregate.indexGet(aggregate.getCount()-1);
}
@Override public Object next() {
Object ret = null;
current--;
if (current >= 0) {
ret = aggregate.indexGet(current);
}
return ret;
}
@Override public Boolean isDone() {
return current < 0 ? true : false;
}
@Override public Object currentItem() {
return this.current;
}
}
public class IteratorMain {
public static void main(String[] args) {
final ConcreteAggregate a = new ConcreteAggregate();
a.add("大鸟");
a.add("小菜");
a.add("行李");
a.add("老外");
a.add("公交内部员工");
a.add("小偷");
final Iterator i = new ConcreteIteratorDesc(a);
final Object item = i.first();
while(!i.isDone()) {
System.out.println(i.currentItem()+"请买车票");
i.next();
}
}
}