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

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

作者: 钉某人 | 来源:发表于2017-11-17 14:58 被阅读0次
    源码地址 https://github.com/DingMouRen/DesignPattern
    迭代器模式.png
    • Iterator迭代器接口负责定义、访问和遍历元素的接口
    • ConcreteIterator具体迭代器类主要实现迭代器接口,并记录遍历的当前位置
    • Aggregate容器接口负责提供创建具体具体迭代器角色的接口
    • ConcreteAggregate具体容器类与具体迭代器角色相关联
    定义

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

    使用场景

    遍历一个容器对象。

    协作

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

    示例代码
    //迭代器接口
    public interface Iterator<T> {
        //是否有下一个元素
        boolean hasNext();
        //返回当前位置的元素,并将位置移到下一位
        T next();
    }
    //具体迭代器类
    public class ConcreteIterator<T> implements Iterator<T> {
        private List<T> list = new ArrayList<>();
        private int cursor = 0;
    
        public ConcreteIterator(List<T> 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<T> {
        //添加元素
        void add(T obj);
        //移除元素
        void remove(T obj);
        //获取迭代器对象
        Iterator<T> iterator();
    }
    //具体容器类
    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<T>(list);
        }
    }
    
    总结

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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/nqjjvxtx.html