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];
            }
        }
    }
    
  • 相关阅读:
    本地及远程二级缓存
    ubuntu下使用golang、qml与ubuntu sdk开发桌面应用
    TCP之心跳包实现思路
    Java读书笔记1
    回文字符串
    6.1 遍历字符串
    linux系统文件夹的作用 good
    在线程中建立Form遇到的问题
    QTabWidget and QTabBar.的文字的颜色设置,三种方法
    Ring3下Hook NtQueryDirectoryFile隐藏文件
  • 原文地址:https://www.cnblogs.com/wei57960/p/14529948.html
Copyright © 2011-2022 走看看