迭代器模式(Iterator Pattern)

迭代器模式(Iterator Pattern)提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。

  简单的说,使用迭代器的遍历方法遍历目标对象,而不是从对象直接获取。

 

获取迭代器的方法有两种(也许有更多),如JDK中集合对象可以直接获取内部迭代器;也可以采用将对象以参数的形式传入到迭代器对象中。下面看代码:

1,聚合对象
/**
 * 内部封装遍历器的聚合类的抽象父类
 */
public abstract class Aggregate {

    protected Object[] list;
    protected int size,index;

    public abstract void add(Object obj);
    public abstract Object get(int index);
    public abstract Iterator iterator();
    public abstract int getSize();
}
/**
 * 聚合类的具体实现
 */
public class ConcreteAggregate extends Aggregate {

    public ConcreteAggregate() {
        index=0;
        size=0;
        list=new Object[100];
    }

    @Override
    public void add(Object obj) {
        list[index++] = obj;
        size++;
    }

    @Override
    public Object get(int index) {
        return list[index];
    }

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

    @Override
    public int getSize() {
        return size;
    }
}

 

2,迭代器接口和实现

public interface Iterator {
    boolean hasNext();
    Object next();
}
/**
 * 具体迭代器
 */
public class ConcreteIterator implements  Iterator {

    private Aggregate aggregate = null;
    private int index;

    public ConcreteIterator(Aggregate aggregate) {
        this.aggregate = aggregate;
    }

    @Override
    public boolean hasNext() {

        return index>=aggregate.getSize()?false:true;

    }

    @Override
    public Object next() {
        return aggregate.get(index++);
    }
}

 

3,测试结果

public class IteratorPattern {
    public static void main(String[] args) {
        Aggregate aggregate = new ConcreteAggregate();  //创建聚合对象
        aggregate.add("a");
        aggregate.add("b");
        aggregate.add("c");
        aggregate.add("d");
        //Iterator iterator = aggregate.iterator();     //获取聚合对象内部遍历器
        Iterator iterator = new ConcreteIterator(aggregate);        //作为参数传入遍历器
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

 

4,控制台打印

a
b
c
d

Process finished with exit code 0

 

迭代器模式的好处,大概是直接使用方法进行遍历,而不用关心内部实现。

posted @ 2018-12-28 13:48  dioag  阅读(223)  评论(0编辑  收藏  举报