迭代器模式(在对象的集合中游走,但是不暴露集合的实现)

源码地址 https://github.com/DingMouRen/DesignPattern
迭代器模式(在对象的集合中游走,但是不暴露集合的实现)_第1张图片
迭代器模式.png
  • Iterator迭代器接口负责定义、访问和遍历元素的接口
  • ConcreteIterator具体迭代器类主要实现迭代器接口,并记录遍历的当前位置
  • Aggregate容器接口负责提供创建具体具体迭代器角色的接口
  • ConcreteAggregate具体容器类与具体迭代器角色相关联
定义

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

使用场景

遍历一个容器对象。

协作

ConcreteIterator跟踪容器中的当前对象,并能够计算出待遍历的后继对象。

示例代码
//迭代器接口
public interface Iterator {
    //是否有下一个元素
    boolean hasNext();
    //返回当前位置的元素,并将位置移到下一位
    T next();
}
//具体迭代器类
public class ConcreteIterator implements Iterator {
    private List list = new ArrayList<>();
    private int cursor = 0;

    public ConcreteIterator(List list) {
        this.list = list;
    }

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

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

//容器接口
public interface Aggregate {
    //添加元素
    void add(T obj);
    //移除元素
    void remove(T obj);
    //获取迭代器对象
    Iterator iterator();
}
//具体容器类
public class ConcreteAggregate implements Aggregate {
    private List list = new ArrayList<>();
    @Override
    public void add(T obj) {
        list.add(obj);
    }

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

    @Override
    public Iterator iterator() {
        return new ConcreteIterator(list);
    }
}
总结

遵循单一原则,弱化容器类与遍历算法之间的关系。在客户端与容器类之间添加一个迭代器类,可以不暴露容器类内部的实现,而得到容器类的元素。

你可能感兴趣的:(迭代器模式(在对象的集合中游走,但是不暴露集合的实现))