`

Java设计模式篇(七)--迭代器模式详解

阅读更多

迭代器模式,就是设计模式中的Iterator模式。Iterate,英文原意是重复,就是重复做某件事情。所以,迭代器的作用就是从头到尾的重复遍历动作,得到数据集合中的一个又一个元素。因此,迭代器模式中肯定会具备两个元素:迭代器和集合。

其实,在我们熟悉的java语言、C语言中,已经把迭代器模式设计在语言中了。我们可以看下Java语言中的迭代器Iterator:


 

 一、迭代器模式概述

我们可以先思考下,如果让我们自己去设计迭代器,你会怎么做?从上面的描述我们可以看到,迭代器的作用是遍历元素,既然是遍历,那就需要用到循环,循环总得有个判断停止条件吧,如果没有元素我们还去遍历什么?因此,我想到的第一个应该具备的方法是判断是否有下一个元素。那当我们判断还有其他元素时,需要干什么,当然是取元素了,那我们需要的第二个方法是获取元素的方法。因此任何迭代器中,这两方法都是必备的,如上图,在Java语言中的迭代器中就存在这两方法:hasNext()和next()。

 

既然是设计模式,当然有一定的模板供我们参考,我们看下给定的迭代器设计模式类图:


迭代器模式中各角色的作用:

1、Iterator接口类:定义了按顺序逐个遍历元素的方法,包含了两基本方法:hasNext()和next(),跟我们分析的一致。

2、ConcreteIterator类:根据关系类图,它实现了Iterator接口类,那当然需要具体实现那两方法,遍历离不开索引下标index,因此会包含此字段。另外,它包含了ConcreteAggregate类的对象--也就是具体的集合对象。

3、Aggregate接口类:定义创建Iterator的方法--iterator().

4、ConcreteAggregate类:根据关系类图,它实现了Aggregate接口类,那么它就会创建具体的迭代器。

 

二、迭代器设计模式举例

根据上述的迭代器设计模式类图,下面我们举一例说明。

假设,我们现在有一个书架,书架上放的是书,我们现在要遍历书架上的书。我们自己设计一个迭代器去实现。我们大致的类图结构是这样的:


 

1、首先需要定义书实体,因为在书架上我们放置的是书。

package com.zhaodf.pattern.iteratorPattern;

public class Book {
    private String bookName;

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }
}

 

 2、定义迭代器接口类

package com.zhaodf.pattern.iteratorPattern;

public interface Iterator {
    boolean hasNext();
    Object next();
}

 

3、定义聚合接口类

 

package com.zhaodf.pattern.iteratorPattern;

public interface Aggregate {
    Iterator iterator();
}

 

 

4、定义具体的集合类

 

package com.zhaodf.pattern.iteratorPattern;

public class BookSelf implements Aggregate {
    //书架上放的是书的集合
    private Book[] books;
    //目的有二:1.当前位置用来放书 2.++后可用来表示书架上有几本书(集合的下标从0开始)
    private int last = 0;

    //定义构造函数
    public BookSelf(int maxSize){
        this.books = new Book[maxSize];
    }
    //获取某位置的书
    public Book getBookAt(int index){
        return books[index];
    }
    //添加书,每添加一本书,位置向后移一位
    public void appendBook(Book book){
        books[last] = book;
        last ++;
    }
    //书架上书的本数
    public int getLength(){
        return last;
    }

    //实现创造迭代器的iterator方法
    public Iterator iterator() {
        return new BookSelfIterator(this);
    }
}

 

 

5、定义具体的迭代器类

 

package com.zhaodf.pattern.iteratorPattern;

public class BookSelfIterator implements Iterator {
    //在迭代器实现类中组合了书集合类,用于遍历
    private BookSelf bookSelf;
    //迭代器中用于判断执元素位置指向的下标
    private int index;

    public BookSelfIterator(BookSelf bookSelf){
        this.bookSelf = bookSelf;
        this.index = 0;
    }
    public boolean hasNext() {
        if(index<bookSelf.getLength()){
            return true;
        }
        return false;
    }

    public Object next() {
        Book book = bookSelf.getBookAt(index);
        index++;
        return book;
    }
}

6、测试类

package com.zhaodf.pattern.iteratorPattern;

public class TestIteratorPattern {
    public static void main(String[] args){
        //定义书架可放书的本数
        BookSelf bookSelf = new BookSelf(4);
        bookSelf.appendBook(new Book("Spring深度源码解析"));
        bookSelf.appendBook(new Book("高并发多线程程序设计"));
        bookSelf.appendBook(new Book("高高效人士的7个习惯"));
        bookSelf.appendBook(new Book("分布式理论"));
        Iterator it = bookSelf.iterator();
        while(it.hasNext()){
            Book book = (Book)it.next();
            System.out.println(book.getBookName());
        }

    }
}

 
 

 

三、迭代器模式的思考

我们为什么要使用迭代器模式去迭代遍历数据集合,而不直接使用for循环遍历呢?一个重要的理由是,使用Iterator可以将数据集合的遍历过程与实现分离。我们在使用下面代码获取数据集合元素时,没有使用到BookSelf类,换句话说,我们的遍历过程并不依赖于具体的集合数据对象实现,而只使用到了迭代器Iterator的hasNext和next方法。

 

while(it.hasNext()){
            Book book = (Book)it.next();
            System.out.println(book.getBookName());
        }

 当具体的数据集合对象BookSelf发生变化时,只要能正确得到迭代器Iterator(Iterator it = bookSelf.iterator();),我们根本就不需要修改其他代码。设计模式的作用是什么?就是提高类的可复用性,当一个组件类发生变化时,其他组件类不需要改动或者改动可以忽略,这才是我们使用设计模式的目的。

另外一个重要的思想是:我们不要总想着使用具体的实现类来编程,要优先使用抽象类接口来编程。

 

 

 四、注意事项

我们很可能对next的含义有理解偏差,有人会问,next方法的返回值到底是指向当前元素还是下一个元素呢?其实它真正的含义是:returnCurrentElementAndAdvanceToNextPosition,即返回当前元素,并且指向下一个元素的位置。

 

  • 大小: 4.6 KB
  • 大小: 32.4 KB
  • 大小: 46.8 KB
分享到:
评论

相关推荐

    java设计模式-图解-附代码

    ### Java设计模式详解 #### 创建型模式 **1.1 工厂方法(Factory Method)** 工厂方法模式定义了一个创建对象的接口,但允许子类决定实例化哪一个类。这使得一个类的实例化可以被推迟到其子类。这种模式在以下...

    java设计模式详解合集

    Java设计模式详解合集是一份宝贵的资源,包含了丰富的面向对象设计原则和多种设计模式的深入讲解。这份资料旨在帮助开发者提升软件设计能力,遵循良好的编程实践,提高代码的可读性、可维护性和复用性。以下是其中...

    JAVA设计模式-chm版

    Java设计模式是软件开发中的一种最佳实践,它总结了在解决特定问题时程序员们经常采用的有效方法。这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的...

    java23种设计模式详解+源码(绝对详解)

    在Java编程中,有23种经典的GoF(Gang of Four)设计模式,它们被分为三大类:创建型、结构型和行为型。本资源集合了这些模式的详细解释与源码分析,旨在帮助开发者深入理解和应用设计模式。 1. 创建型模式...

    java23中设计模式详解

    Java中的23种设计模式是软件工程中非常重要的概念,它们是解决常见编程问题的成熟解决方案,被广泛应用于各种复杂的软件系统中。这些模式在不同的上下文中提供了可重用的结构和行为,使得代码更加清晰、可维护和扩展...

    《Java设计模式》详解

    内容包括统一建模语言基础知识、面向对象设计原则、设计模式概述、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式、适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、...

    Java设计模式-图解-附代码

    ### Java设计模式详解 #### 一、概述 Java设计模式是一种在特定场景下解决软件设计问题的方法论。设计模式能够帮助开发者在面对复杂问题时,更有效地组织代码、提高程序的可维护性和可扩展性。根据不同的应用场景...

    java设计模式的应用

    ### Java设计模式的应用 #### 一、引言 在当今快速发展的软件开发领域,Java作为一门功能强大且灵活的语言,不仅拥有丰富的API资源,还能与强大的数据库系统无缝对接。这使得许多开发人员能够以模块化的形式构建...

    java24种设计模式详解

    设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的模板或蓝图。...在"java24种设计模式详解"这个资源中,你会找到每种模式的详细讲解和实例,这将有助于你深入理解并掌握它们。

    Java设计模式-23种设计模式详解

    Java设计模式详解 Java设计模式是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。 设计模式的六大原则...

    23种java设计模式.pdf

    " JAVA 设计模式概述" JAVA 设计模式是指在软件设计过程中,为了提高代码的可维护性、灵活性和可扩展性所使用的一些惯用解决方案。JAVA 设计模式可以分为三种:创建模式、结构模式和行为模式。 1. 创建模式 创建...

    Java中23种设计模式详解

    Java 中 23 种设计模式详解 在软件设计中,设计模式是解决特定问题的通用解决方案。 Java 中有 23 种常见的设计模式,下面将对每种设计模式进行详细的解释: 1. 抽象工厂模式(Abstract Factory) 抽象工厂模式...

    根据《JAVA与设计模式》整理的笔记及示例代码

    Java是一种广泛使用的面向对象的编程语言,而设计模式则是软件工程中解决常见问题的经验总结,是程序员在实践中形成的最佳实践。这份"根据《JAVA与设计模式》整理的笔记及示例代码"涵盖了Java语言和设计模式的核心...

    详解Java设计模式——迭代器模式

    详解Java设计模式——迭代器模式 迭代器模式是Java设计模式的一种,主要用于解决聚合对象的遍历问题。该模式提供了一种方法顺序访问一个聚合对象中的各个元素,而又无须暴露该对象的内部表示。通过使用迭代器模式,...

    java设计模式选择题复习

    ### Java设计模式选择题复习知识点详解 #### 工厂系列模式的优缺点 - **优点**: - **解耦**:工厂模式的核心优势之一在于它让用户代码与具体产品的实现相分离,使得用户无需了解产品是如何创建的,只需要知道...

    后端-设计模式-java-精讲

    ### 后端-设计模式-java-精讲 #### 一、设计模式概述 设计模式是在软件工程领域中,为了应对特定的问题或需求而形成的最佳实践的解决方案。它们为解决常见问题提供了一种标准的方法,有助于提高代码的复用性、...

    JAVA设计模式与JAVA多线程设计模式详解

    在Java编程领域,设计模式和多线程设计模式是开发者必备的技能。...在阅读提供的"JAVA设计模式"文档时,务必关注每个模式的适用场景、优缺点以及如何在实际项目中应用,这将使你的编程技能得到质的飞跃。

    Java的23种设计模式详解

    在Java编程中,有23种经典的设计模式,它们是面向对象设计的核心部分,帮助我们编写可维护、可扩展且高效的应用程序。以下是这23种设计模式的概述,结合代码实例进行详细说明。 1. **单例模式(Singleton)**:确保...

    java设计模式视频详解

    在深入探讨《Java设计模式视频详解》所涵盖的内容之前,我们先来了解一下设计模式的基本概念。设计模式是在软件设计过程中解决常见问题的一套被广泛接受的解决方案。它们并不是完成任务的具体代码,而是用来解决问题...

    java设计模式详解

    Java设计模式详解 设计模式是软件开发中的重要概念,它是一种在特定场景下解决常见问题的标准解决方案,旨在提高代码的可重用性、可读性和可维护性。设计模式是面向对象编程领域的宝贵经验总结,它将过去成功的编程...

Global site tag (gtag.js) - Google Analytics