zoukankan      html  css  js  c++  java
  • 设计模式之迭代器模式

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

    迭代器模式(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];
            }
        }
    }
    
  • 相关阅读:
    thinkphp中的验证码的实现
    js深入研究之牛逼的类封装设计
    js深入研究之函数内的函数
    js深入研究之初始化验证
    js深入研究之Person类案例
    js深入研究之匿名函数
    js深入研究之类定义与使用
    sublime text3 自动编译php 适合用于简单的php文件执行
    PHP实现四种基本排序算法 得多消化消化
    thinkphp中的类库与引用import引入机制
  • 原文地址:https://www.cnblogs.com/wei57960/p/14529948.html
Copyright © 2011-2022 走看看