`

设计模式之 Iterator - 迭代模式

阅读更多

Iterator模式也叫迭代模式,是由GoF提出的23种设计模式的一种。Iterator模式是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator(遍历)按顺序进行遍历访问的设计模式。

本文介绍设计模式中的迭代(Iterator)模式的概念,用法,以及实际应用中怎么样使用迭代模式进行开发。
Iterator模式的概念

Iterator模式指对容器中包含的内部对象的访问委让给外部类,使用Iterator(遍历)按顺序进行遍历访问的设计模式。
在程序设计中,经常有这种情况,需要从大量得数据(对象)集合中一个个地取出数据加以处理。Iterator模式就是为了有效地处理按顺序进行遍历访问的一种设计模式,简单地说,Iterator模式提供一种有效的方法,可以屏蔽聚集对象集合的容器类的实现细节,而能对容器内包含的对象元素按顺序进行有效的遍历访问。
所以,Iterator模式的应用场景可以归纳为满足以下几个条件:
- 访问容器中包含的内部对象
- 按顺序访问

为什么需要Iterator模式
在应用Iterator模式之前,首先应该明白Iterator模式用来解决什么问题。或者说,如果不使用Iterator模式,会存在什么问题。
我们举例来说明Iterator模式到底好在哪。

比如有一个Book类,一个管理Book的容器类BookList:
public class Book {
    ...
}

public class BookList {
    //保存Book对象数据
    private List bookList = new ArrayList();

    //添加Book对象至BookList容器
    public void addBook(Book book) {
        ...
    }

    //从BookList容器删除Book对象
    public void deleteBook(Book book) {
        ...
    }

    //其他方法
    ...
}


我们需要按顺序遍历访问BookList包含的Book对象。
怎么实现顺序遍历方法呢?

你可能会考虑以下这些遍历方法:
方法1,由容器自己实现顺序遍历。直接在BookList里直接添加顺序遍历方法:
public class BookList {
    private int index;
    ...
    //得到当前Book
    public Book getCurrentBook() {
        ...
        Book book = (Book)bookList.get(index);
        ...
        return book;
    }

    //是否存在下一个Book
    public boolean hasNext() {
        ...
    }
}


使用时,可能的使用方法是:
BookList bookList = ...;
...
while (bookList.hasNext()) {
    Book book = bookList.getCurrentBook();
    //对Book加以处理(略)
    ...
}


方法2,让调用者自己实现遍历。直接暴露BookList数据细节给外部,比如:
public class BookList {
    ...
    public Book getBookList() {
        ...
        return bookList;
    }
}


可能的使用方法为:
BookList bookList = ...;
List <Book>bookDataList = bookList.getBookList();
...
for (int i=0; bookDataList != null && i<bookDataList.size(); i++) {
    Book book = bookDataList.get(i);
    //对Book加以处理(略)
    ...
}


以上方法1与方法2都可以实现对BookList所包含的Book对象进行遍历,这样有问题呢?
确实使用上没有任何问题。
但实现方法1中,
1,容器类BookList承担了太多功能:一方面需要提供添加删除等BookList本身应有的功能;一方面还需要提供遍历访问功能。
2,往往容器在实现遍历的过程中,需要保存遍历状态,当跟元素的添加删除等功能夹杂在一起,很容易引起混乱和程序运行错误等。

在实现方法2中,
容器本身未实现任何遍历方法,把这个遍历的任务交给了调用者,这样一来,暴露了容器本身的实现细节,如果一旦容器内部的数据接口发生变化,比如由于某种原因,BookList的List bookList用Map bookList来实现,这样,所有调用方的程序不得不随着BookList的修改而修改。


Iterator模式很好地解决了以上问题。
我们先从JDK中的Collection Framework对Iterator模式的实现方法来说明Iterator模式。

Java Collections Framework - Java集合框架List,Map,Set等全面介绍之概要篇


Java Collection Framework对迭代模式的经典实现
1,迭代接口:Iterator接口,定义了遍历接口:
public interface Iterator
{
    //判断是否存在下一个元素
    public abstract boolean hasNext();
    //返回下一个可用的元素
    public abstract Object next();
    //移除当前元素
    public abstract void remove();
}


2,容器接口:Collection接口,定义了iterator()方法,把遍历委让给Iterator的实现类。
public interface Collection
    extends Iterable
{
    ...
    //取得对所有元素的遍历。可以通过Iterator提供的方法遍历集合的元素
    public abstract Iterator iterator();
    ...
}


3,容器接口Collection的实现类与迭代接口Iterator的实现类:
public abstract class AbstractList extends AbstractCollection implements List {
    ...
    //负责创建具体迭代器角色的工厂方法
    public Iterator iterator() {
        //把遍历委让给Iterator的实现类Itr。
        return new Itr();
    }

    //迭代接口Iterator的实现类
    private class Itr implements Iterator {
        ...
    }
    ...
}


public class ArrayList extends AbstractList {
    ...
}


以上说明了Java Collection Framework里的对Iterator模式的基本实现方法。

这也是Iterator模式一种经典的实现方案。

经典的Iterator模式实现方案
下面是一种比较经典的Iterator模式实现方案,该实现方案基于接口设计原则,设计了以下几个接口或类:
迭代器接口Iterator:该接口必须定义实现迭代功能的最小定义方法集比如提供hasNext()和next()方法。
迭代器实现类:迭代器接口Iterator的实现类。可以根据具体情况加以实现。
容器接口:定义基本功能以及提供类似Iterator iterator()的方法。
容器实现类:容器接口的实现类。必须实现Iterator iterator()方法。

Iterator模式的类图:

[该图出自Wikipedia]

应用我们的上面介绍的例子,我们需要定义以下几个接口与类:
public class public interface IBookList {
    public BookListIterator iterator();
}
BookListImpl implements IBookList {
    public BookListIterator iterator() {
        return new BookListIteratorImpl(this);
    }
}
public interface BookListIterator {
    public boolean hasNext();
    public Book next();
}
public class BookListIteratorImpl implements BookListIterator {
    ...(具体实现过程略)
}


对容器的遍历方法例:
IBookList list = ...;
BookListIterator it = list.iterator();
while(it.hasNext()){
    Book book = it.next();
    ...
}



Iterator模式的优点
1,实现功能分离,简化容器接口。让容器只实现本身的基本功能,把迭代功能委让给外部类实现,符合类的设计原则。
2,隐藏容器的实现细节。
3,为容器或其子容器提供了一个统一接口,一方面方便调用;另一方面使得调用者不必关注迭代器的实现细节。
4,可以为容器或其子容器实现不同的迭代方法或多个迭代方法。
分享到:
评论

相关推荐

    Android设计模式之--迭代器模式

    迭代器模式是软件设计模式中的一种行为模式,它在Android开发中被广泛应用,尤其是在处理集合对象的遍历操作时。这种模式提供了一种方法来顺序访问聚合对象的元素,而又不暴露其底层表示。在Java或Android编程中,...

    iterator-demo 迭代器设计模式demo

    迭代器设计模式是一种常用的行为设计模式,它提供了一种方法来顺序访问聚合对象的元素,而又不暴露其底层表示。这个“iterator-demo”应该是一个示例项目,用于演示如何在实际编程中应用迭代器模式。下面我们将深入...

    23中设计模式-迭代器(Iterator.html

    23中设计模式-迭代器(Iterator.html

    设计模式--迭代器模式java例子

    迭代器模式是一种行为设计模式,它允许我们顺序访问聚合对象的元素,而无需暴露其底层表示。在Java中,迭代器模式广泛应用于集合框架,如ArrayList、LinkedList等。本示例将深入探讨如何在Java中实现和使用迭代器...

    IteratorPattern 迭代设计模式

    迭代器模式(IteratorPattern)是设计模式中的一种行为模式,它提供了一种顺序访问聚合对象元素的方法,同时又不暴露其底层表示。这种模式允许我们遍历集合对象的元素,而无需暴露其内部结构。在Java、C#等面向对象...

    java设计模式--迭代器设计模式.docx

    迭代器模式是软件设计模式中的一种行为模式,其主要目的是为了在不暴露聚合对象内部结构的情况下,提供一种顺序访问聚合对象中各个元素的方式。在Java中,迭代器模式被广泛应用于集合类,如ArrayList、LinkedList等...

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

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

    (行为型模式) Iterator 迭代器模式

    C#面向对象设计模式 (行为型模式) Iterator 迭代器模式 视频讲座下载

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

    - 迭代器模式(Iterator):提供一种方法顺序访问聚合对象的元素,而又不暴露其底层表示。 - 中介者模式(Mediator):用一个中介对象来封装一系列的对象交互。 - 备忘录模式(Memento):在不破坏封装性的前提下...

    java常用设计模式-迭代器模式

    Java 迭代器模式是一种行为设计模式,它提供了一种访问集合对象元素的方法,而不需要暴露该对象的内部表示。该模式适用于需要遍历集合对象的场景,例如数组、列表、树等。 迭代器模式的主要优点是: 1. 避免了集合...

    设计模式之迭代器模式(Iterator)

    迭代器模式是软件设计模式中的一种行为模式,它在编程中扮演着重要的角色,尤其是在处理集合数据时。迭代器模式的核心思想是提供一种方法来顺序访问聚合对象的元素,而无需暴露其底层表示。这种模式使得用户可以在不...

    设计模式-迭代器模式

    迭代器模式是一种软件设计模式,它提供了一种方法来顺序访问聚合对象的元素,而无需暴露其底层表示。在iOS开发中,迭代器模式同样适用,可以帮助开发者在不暴露内部数据结构的情况下遍历集合对象。下面我们将深入...

    设计模式-迭代器模式(讲解及其实现代码)

    迭代器模式是一种行为设计模式,它提供了一种方法来顺序访问聚合对象的元素,而无需暴露其底层表示。这种模式允许我们遍历集合中的每个元素,同时保持集合本身抽象,不需了解其内部结构。 在Java、C#等面向对象语言...

    设计模式C++学习之迭代器模式(Iterator)

    迭代器模式是软件设计模式中的行为模式之一,它在C++编程中有着广泛的应用。这个模式提供了一种方法来顺序访问聚合对象的元素,而无需暴露其底层表示。通过迭代器,用户可以遍历集合中的所有元素,而无需知道如何...

    C++设计模式课件21_Iterator_迭代器.pdf

    ### C++设计模式之迭代器(Iterator)模式详解 #### 一、引言 在软件开发过程中,设计模式是解决特定问题的一种通用解决方案。其中,迭代器模式是一种常用的模式,它提供了一种方法来访问一个容器对象中的各个元素...

    Java设计模式之Iterator模式

    2.定义一个Iterator迭代器的接口 3.定义一个ArrayList,实现Collection接口,并写一个实现了Iterator接口的内部类。 4.编写测试程序TestMain 从以上可以看出,设计模式到处用到面向对象中的多态。接口调用子类中的...

    java设计模式---诙谐易懂版

    根据给定文件内容,以下是关于Java设计模式的知识点说明: 1. 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。策略模式的意图是定义一系列算法,将每个算法封装起来,并使它们可以...

    迭代器模式(Iterator Pattern)详解 1. 什么是迭代器模式? 2. 为什么需要迭代器模式? 3. 迭代器模式的核心概念 3.1 迭代器(Iterator) 3.2 具体迭代器(Conc

    8. 迭代器模式与其他设计模式的比较 8.1 迭代器模式 vs 访问者模式 8.2 迭代器模式 vs 组合模式 8.3 迭代器模式 vs 模板方法模式 9. 迭代器模式的优缺点 9.1 优点 9.2 缺点 10. 何时使用迭代器模式? 11. 常见问题与...

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

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

Global site tag (gtag.js) - Google Analytics