`
taogebx
  • 浏览: 33561 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

集合初探--集合中的设计模式之Iterator模式

阅读更多
1. Iterator模式

·标准定义:提供一种统一的方法顺序访问一个聚合对象中各个元素,而又不需要暴露对象的内部表示。


·其本质体现了面向对象单一职责原则:一个聚合对象提供两个职责,一是组织管理数据对象,二是提供遍历算法。遍历算法会变,那么就隔离变化,抽象为一个迭代器,从而使得聚合对象职责单一。

2. 集合中的Iterator模式




·Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。

例如,如果没有使用Iterator,遍历一个数组的方法是使用索引:
    for(int i=0; i<array.size(); i++) { ... get(i) ... }

而访问一个链表(LinkedList)又必须使用while循环:
    while((e=e.next())!=null) { ... e.data() ... }

·以上两种方法客户端都必须事先知道集合的内部结构,访问代码和集合本身是紧耦合,无法将访问逻辑从集合类和客户端代码中分离出来,每一种集合对应一种遍历方法,客户端代码无法复用。

·如果以后需要把ArrayList更换为LinkedList,则原来的客户端代码必须全部重写。

·为解决以上问题,Iterator模式总是用同一种逻辑来遍历集合:
    for(Iterator it = c.iterater(); it.hasNext(); ) { 
        Object o = it.next();
        // 对o的操作...
    }

·客户端自身不维护遍历集合的信息,所有的内部状态(如当前元素位置,是否有下一个元素)都由Iterator来维护,而这个Iterator由集合类通过工厂方法生成,因此,它知道如何遍历整个集合。

·客户端从不直接和集合类打交道,它总是控制Iterator,向它发送"向前","向后","取当前元素"的命令,就可以间接遍历整个集合。客户端不关心到底是哪种Iterator,它只需要获得这个Iterator接口即可,这就是面向抽象的威力。


3. Iterator源码剖析

·首先看看java.util.Iterator接口的定义:
    public interface Iterator {
        boolean hasNext();
        Object next();
        void remove();
    }


·再来看看AbstracyList如何创建Iterator。首先AbstractList定义了一个内部类(inner class,以便能访问集合属性):
     private class Itr implements Iterator {
        ...
     }

    而iterator()方法的定义是:
    public Iterator iterator() {
        return new Itr();
    }
  
    因此客户端不知道它通过Iterator it = a.iterator();所获得的Iterator的真正类型。

·那么private的Itr类是如何实现遍历AbstractList的?
    private class Itr implements Iterator {
        int cursor = 0;
        int lastRet = -1;
        int expectedModCount = modCount;
    }

·Itr类依靠3个int变量来实现遍历,cursor是下一次next()调用时元素的位置,第一次调用next()将返回索引为0的元素。lastRet记录上一次游标所在位置,因此它总是比cursor少1。

·变量cursor和集合的元素个数决定hasNext():
    public boolean hasNext() {
        return cursor != size(); //下一个元素位置不等于集合的大小
    }

   
·方法next()返回的是索引为cursor的元素,然后修改cursor和lastRet的值:
public Object next() {
        checkForComodification();
        try {
            Object next = get(cursor);
            lastRet = cursor++;
            return next;
        } catch(IndexOutOfBoundsException e) {
            checkForComodification();
            throw new NoSuchElementException();
        }
    }


·其他集合Iterator的遍历方式类似,不在细说。
  
  • 大小: 21 KB
  • 大小: 52.8 KB
  • 大小: 46.4 KB
分享到:
评论

相关推荐

    开源项目-json-iterator-go.zip

    开源项目“json-iterator-go”是一个针对Go语言的高性能JSON解析库,它的设计目标是提供与标准库`encoding/json`完全兼容的接口,同时在性能上有所提升。这个压缩包`json-iterator-go.zip`包含了项目的源代码,具体...

    java-util-iterator.pdf java-util-iterator.pdf

    根据提供的文件信息,本文将深入探讨Java中的`java.util.Iterator`接口及其在集合类中的应用。我们将从以下几个方面进行详细解析: ### 一、集合类的根接口:Collection `Collection`接口是Java集合框架的基础,它...

    前端开源库-async-iterator-all

    `async-iterator-all`是一个非常实用的开源库,专为处理异步迭代器设计,帮助开发者更方便地从异步迭代器中收集所有值并转换成数组。这个库的核心功能是简化了对异步生成器(async generator)的处理,使得异步数据...

    iterator-demo 迭代器设计模式demo

    这个“iterator-demo”应该是一个示例项目,用于演示如何在实际编程中应用迭代器模式。下面我们将深入探讨迭代器模式及其在IT领域的应用。 迭代器模式的核心思想是为集合类提供一种统一的访问方式,使得客户代码...

    java基础 集合-22-迭代器设计模式

    在Java编程语言中,集合框架是处理对象数组的核心部分,而迭代器设计模式则是访问集合元素的主要机制。本文将深入探讨Java中的迭代器模式及其在集合框架中的应用。 迭代器模式是一种行为设计模式,它提供了一种方法...

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    设计模式是软件工程中的一种最佳实践,用于解决在软件开发过程中常见的问题。这些模式是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师,通常被称为GoF(Gang of Four),在他们的经典著作...

    c++ 的array源码分析和reverse-iterator和-Array-const-iterator类

    c++ 的array源码分析和reverse-iterator和-Array-const-iterator类

    00-初探 Laravel 和其中的设计模式(3).html

    在书中,作者们将这二十三种设计模式分成了三类,分别是创建型模式、结构型模式和行为型模式。 创建型模式包含了: 工厂方法模式( Factory Method ) 抽象工厂模式( Abstract Factory ) 单例模式( Singleton ...

    Csharp设计模式电子版--一本很好C#设计模式

    《C#设计模式》是一本深入探讨C#编程语言中设计模式的专业书籍,它涵盖了软件开发中的各种经典设计模式,旨在提升代码的可维护性、可扩展性和复用性。设计模式是经过时间考验的解决方案,是软件工程中的宝贵经验结晶...

    Java设计模式之Iterator模式

    参考:马士兵 Java设计模式 Iterator 1.首先定义一个容器Collection接口. 2.定义一个Iterator迭代器的接口 3.定义一个ArrayList,实现Collection接口,并写一个实现了Iterator接口的内部类。 4.编写测试程序TestMain...

    设计模式(C#)之迭代器模式(Iterator Pattern)

    迭代器模式是软件设计模式中的一种行为模式,它在C#等面向对象编程语言中有着广泛的应用。这个模式的主要目标是允许用户遍历一个聚合对象(如数组、集合或列表)的所有元素,而无需了解底层的实现细节。下面将详细...

    设计模式精解-GoF 23种设计模式解析附C++.pdf

    - **Iterator模式**:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 - **Interpreter模式**:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释...

    分析-Iterator-base12与-Container-base12

    分析-Iterator-base12与-Container-base12

    Java源码分析:深入探讨Iterator模式

    为了遍历这些容器中的元素,Java引入了迭代器模式(Iterator Pattern),这是一种常用的设计模式,它提供了一种访问聚合对象的方法,而无需暴露其内部表示。本文将详细解析Iterator模式在Java中的实现原理,并通过...

    这是一套 Java 设计模式的集合示例-design-pattern.zip

    Java设计模式是软件工程中的一种最佳实践,它们是解决常见编程问题的经验总结,可以提高代码的可重用性、可维护性和可扩展性。在"design-pattern.zip"这个压缩包中,我们很可能会找到一系列与Java设计模式相关的代码...

    设计模式PPT---25种设计模式详解

    设计模式是软件工程中的一种最佳实践,用于解决在开发过程中经常遇到的问题,提供了一套可重用的解决方案。这份名为“设计模式PPT——25种设计模式详解”的资料,显然是一个深入探讨设计模式的教程,它通过PDF格式对...

    2016-2017第2学期《设计模式》期末考试A卷及参考答案

    设计模式是软件工程中的一种重要概念,它是在特定上下文中解决常见问题的模板,为软件设计提供了可重用的最佳实践。这份2016-2017学年第2学期的《设计模式》期末考试A卷及其参考答案,旨在检验学生们对设计模式的...

    Laravel开发-multi-level-array-iterator

    `php-multi-level-array-iterator-master`这个项目很可能包含了完整的实现和示例,你可以下载并研究其代码,以获取更多关于如何在Laravel环境中创建和使用多级数组迭代器的详细信息。 总之,理解并掌握Laravel的...

Global site tag (gtag.js) - Google Analytics