• 设计模式之迭代器模式


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

    迭代器模式(Iterator)实际上在Java的集合类中已经广泛使用了。我们以List为例,要遍历ArrayList,即使我们知道它的内部存储了一个Object[]数组,也不应该直接使用数组索引去遍历,因为这样需要了解集合内部的存储结构。如果使用Iterator遍历,那么,ArrayList和LinkedList都可以以一种统一的接口来遍历:

    for(Iterator<String> it = list.iterator();it.hasNext()){
        String s = it.next();
    }
    

    不需要知道其内部结构,只调用其迭代器获取对象

    Java允许我们直接把任何支持Iterator的集合对象用foreach循环写出来:

    List<String> list = ...
    for (String s : list) {
    
    }
    

    然后由Java编译器完成Iterator模式的所有循环代码。

    如何实现一个Iterator

    AbstractList中有内部类Itr implements Iterator

    Collection接口继承了Iterable接口

    public class ReverseArrayCollection<T> implements Iterable<T> {
    
        private T[] array;
    
        public ReverseArrayCollection(T... array) {
            this.array = array;
        }
    
        // 返回一个 iterator 对象
        @Override
        public Iterator<T> iterator() {
            return new ReverseArrayIterator();
        }
    
        class ReverseArrayIterator implements Iterator<T> {
            int index;
    
            public ReverseArrayIterator() {
                // 由于倒序 index 在数组的末尾
                this.index = ReverseArrayCollection.this.array.length;
            }
    
            @Override
            public boolean hasNext() {
                // 如果index大于零则代表可以向前遍历
                return index > 0;
            }
    
            @Override
            public T next() {
                return array[--index];
            }
        }
    }
    
  • 相关阅读:
    开源:不断创新的动力
    Inkpad中文翻译已合并到官方项目
    Inkpad绘图原理浅析
    Vectoroid
    发布大幅重构优化的 TouchVG 1.0.2
    清理掉一直想研究的开源项目
    函数指针调用方式
    音视频直播优化
    std::unique_lock与std::lock_guard区别示例
    c++容器的操作方法总结
  • 原文地址:https://www.cnblogs.com/wei57960/p/14529948.html
Copyright © 2020-2023  润新知