一、定义

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

责任和职责:

Iterator(迭代器接口):

    该接口必须定义实现迭代功能的最小定义方法集

    比如提供hasNext()和next()方法。

ConcreteIterator(迭代器实现类):

    迭代器接口Iterator的实现类。可以根据具体情况加以实现。

Aggregate(容器接口):

    定义基本功能以及提供类似Iteratoriterator()的方法。

ConcreteAggregate(容器实现类):

    容器接口的实现类。必须实现Iteratoriterator()方法。

二、场景展示

类图如下:

 通用代码实现:

/**
 * 迭代器接口
 * 
 * @author arain.liu
 *
 */
public interface Iterator<T> {
    /**
     * 是否还有下一个元素
     * 
     * @return
     */
    boolean hasNext();

    /**
     * 返回当前位置的元素,并将位置移动到下一位
     * 
     * @return
     */
    T next();
}

 

/**
 * 
 * 具体迭代器
 * 
 * @author arain.liu
 *
 */
public class ConcreteIterator<T> implements Iterator<T> {

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

    private int cursor = 0;

    public boolean hasNext() {
        return cursor != list.size();
    }

    public T next() {
        T obj = null;
        if (this.hasNext()) {
            obj = this.list.get(cursor++);
        }
        return obj;
    }

}

 

/**
 * 容器接口
 * 
 * @author arain.liu
 *
 */
public interface Aggregate<T> {
    /**
     * 添加一个元素
     * 
     * @param obj 元素对象
     */
    void add(T obj);

    /**
     * 移除一个元素
     * 
     * @param obj 元素对象
     */
    void remove(T obj);

    /**
     * 获取容器的迭代器
     * 
     * @return 迭代器对象
     */
    Iterator<T> iterator();
}

 

/**
 * 具体容器接口
 * 
 * @author arain.liu
 */
public class ConcreteAggregate<T> implements Aggregate<T> {

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

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

    @Override
    public void remove(T obj) {
        list.remove(obj);
    }

    @Override
    public Iterator<T> iterator() {
        return new ConcreteIterator<>();
    }
}

 

/**
 * 
 * Client类
 * 
 * @author arain.liu
 */
public class MainClass {

    public static void main(String[] args) {

        Aggregate<String> agt = new ConcreteAggregate<>();
        agt.add("aLin");
        agt.add("jack");
        agt.add("yushao");

        Iterator<String> itr = agt.iterator();
        while (itr.hasNext()) {
            System.out.println(itr.next());
        }
    }

}

迭代器优点:

    1、实现功能分离,简化容器接口。让容器只实现本身的基本功能,把迭代功能委让给外部类实现,符合类的设计原则。

    2、隐藏容器的实现细节。

    3、为容器或其子容器提供了一个统一接口,一方面方便调用;另一方面使得调用者不必关注迭代器的实现细节。

    4、可以为容器或其子容器实现不同的迭代方法或多个迭代方法。

缺点:

    由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

posted on 2019-05-27 11:35  友帅老师  阅读(104)  评论(0)    收藏  举报