什么是迭代器模式

提供一个方法来访问聚合对象,而不用暴露这个对象的内部结构。

迭代器模式的结构

  • Aggregate:抽象聚合类

  • ConcreteAggregate:具体聚合类

  • Iterator:抽象迭代器

  • ConcreteIterator:具体迭代器

迭代器模式的一个实例

Iterator

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

ConcreteIterator

import java.util.List;

public class ConcreteIterator extends Iterator {

    private ConcreteList list;
    private List<Object> objects;
    private int cur = 0;

    public ConcreteIterator(ConcreteList list) {
        this.list = list;
        this.objects = list.getObjects();
    }

    @Override
    public Object first() {
        return list.size()>0 ? objects.get(0) : null;
    }

    @Override
    public Object next() {
        if (cur < list.size()){
            return objects.get(cur++);
        }
        return null;
    }

    @Override
    public boolean isDone() {
        return cur == list.size() ? true : false;
    }

    @Override
    public Object currentItem() {
        return objects.get(cur);
    }
}

AbstractList

import java.util.List;

public abstract class AbstractList {
    public abstract void add(Object obj);
    public abstract int size();
    public abstract List<Object> getObjects();
    public abstract Iterator createIterator();
}

ConcreteList

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

public class ConcreteList extends AbstractList {

    private List<Object> list = new ArrayList<Object>();

    @Override
    public void add(Object obj) {
       list.add(obj);
    }

    @Override
    public int size() {
        return list.size();
    }

    @Override
    public List<Object> getObjects() {
        return list;
    }

    @Override
    public Iterator createIterator() {
        return new ConcreteIterator(this);
    }
}

Client

public class Client {
    public static void main(String[] args){
        AbstractList list = new ConcreteList();
        list.add("Hello");
        list.add("World");
        list.add("!");

        Iterator iterator = list.createIterator();
        while (!iterator.isDone()){
            System.out.println(iterator.next());
        }
    }
}

实例结果

Hello
World
!

(完)