18 设计模式之迭代器模式(书籍遍历案例)

一、什么是迭代器模式

迭代器模式(Iterator Pattern)是一种行为型设计模式,允许客户端通过统一的接口顺序访问一个集合对象中的元素,而无需暴露集合对象的内部实现。这个模式主要用于访问聚合对象(如集合、数组等)中的元素,并且能够支持不同类型的聚合对象。

主要角色:

  • Iterator(迭代器) :提供遍历集合元素的接口,通常包括 hasNext()next() 方法。
  • ConcreteIterator(具体迭代器) :实现 Iterator 接口,跟踪集合的当前状态,并实现集合的迭代。
  • Aggregate(聚合接口):定义创建迭代器的方法。
  • ConcreteAggregate(具体聚合) :实现 Aggregate 接口,返回对应的具体迭代器。

二、迭代器模式的应用场景

迭代器模式通常应用于以下场景:

  • 当需要顺序访问集合中的元素时,不需要知道具体的存储方式(例如数组、链表等)。
  • 想要提供一个统一的遍历接口,支持多种不同类型的聚合对象。
  • 当要对集合元素进行多次遍历时,可以减少代码重复性。

三、迭代器模式的优缺点

1.优点:

  • 封装性:客户端无需了解集合的内部结构,通过迭代器统一访问集合元素。
  • 灵活性:可以通过不同的迭代器实现来支持对不同类型集合的访问。
  • 解耦:集合和客户端解耦,客户端只关心元素的顺序,而不需要关心集合的具体实现方式。

2.缺点:

  • 增加复杂性:引入了额外的迭代器类和接口,代码结构可能变得更复杂。
  • 性能问题:如果集合中元素较多,迭代器可能会增加额外的时间复杂度。

四、迭代器模式的代码实现

1.定义迭代器接口

首先,我们定义一个通用的迭代器接口 Iterator,它需要包含两个方法:hasNext()next()

java 复制代码
public interface Iterator {
    boolean hasNext();
    String next();
}
  • hasNext():判断集合是否还有元素。
  • next():返回当前元素,并将迭代器指向下一个元素。

2. 创建具体迭代器类

然后,我们实现一个具体的迭代器类 BookIterator,来跟踪书籍集合的位置,并提供实际的遍历功能。

java 复制代码
public class BookIterator implements Iterator {
    private BookCollection bookCollection;
    private int currentIndex = 0;

    public BookIterator(BookCollection bookCollection) {
        this.bookCollection = bookCollection;
    }

    @Override
    public boolean hasNext() {
        return currentIndex < bookCollection.getBooks().size();
    }

    @Override
    public String next() {
        if (hasNext()) {
            return bookCollection.getBooks().get(currentIndex++);
        }
        return null;
    }
}

BookIterator 类中,我们维护一个 currentIndex 变量,用来追踪当前指向的位置。通过实现 hasNext()next() 方法,我们可以顺序访问集合中的元素。

3. 创建聚合类

接下来,我们创建一个聚合类 BookCollection,它是一个包含多个书籍名称的集合。BookCollection 类需要提供方法来添加书籍,并返回具体的迭代器。

java 复制代码
import java.util.ArrayList;
import java.util.List;

public class BookCollection {
    private List<String> books;

    public BookCollection() {
        books = new ArrayList<>();
    }

    public void addBook(String book) {
        books.add(book);
    }

    public List<String> getBooks() {
        return books;
    }

    public Iterator createIterator() {
        return new BookIterator(this);
    }
}

4. 测试迭代器模式

最后,我们在 TestIterator 类中,创建一个 BookCollection 对象,并通过迭代器遍历其中的书籍:

java 复制代码
public class TestIterator {
    public static void main(String[] args) {
        // 创建书籍集合
        BookCollection bookCollection = new BookCollection();

        // 添加书籍
        bookCollection.addBook("Java设计模式");
        bookCollection.addBook("软件工程导论");
        bookCollection.addBook("JavaWeb");
        bookCollection.addBook("软件设计师");

        // 获取迭代器并遍历书籍
        Iterator iterator = bookCollection.createIterator();

        // 使用迭代器遍历书籍集合
        while (iterator.hasNext()) {
            String book = iterator.next();
            System.out.println(book);
        }
    }
}

5.输出

Java设计模式

软件工程导论

JavaWeb

软件设计师


五、代码解析

  1. Iterator 接口 :定义了遍历集合的标准方法:hasNext()next()
  2. ConcreteIterator(BookIterator) :实现了 Iterator 接口,具体负责遍历书籍集合,保持当前索引,并提供方法返回当前书籍。
  3. ConcreteAggregate(BookCollection):表示一个书籍集合,提供方法添加书籍和创建迭代器。
  4. TestIterator :测试类,用来展示如何创建 BookCollection 对象并使用迭代器遍历书籍。

六、总结

迭代器模式通过提供一个统一的访问接口,使得客户端能够在不暴露集合内部结构的情况下,顺序访问集合中的元素。通过实现 Iterator 接口和具体的迭代器类,我们可以轻松地遍历各种集合对象。不过,它也增加了一定的复杂性,特别是在处理大型集合时,可能会影响性能。

相关推荐
上理考研周导师42 分钟前
【单片机原理】第1章 微机基础知识,运算器,控制器,寄存器,微机工作过程,数制转换
算法
檀越剑指大厂1 小时前
【Python系列】Python中的`any`函数:检查“至少有一个”条件满足
开发语言·python
I_Am_Me_2 小时前
【JavaEE初阶】线程安全问题
开发语言·python
IT猿手2 小时前
基于PWLCM混沌映射的麋鹿群优化算法(Elk herd optimizer,EHO)的多无人机协同路径规划,MATLAB代码
算法·elk·机器学习·matlab·无人机·聚类·强化学习
运维&陈同学2 小时前
【Elasticsearch05】企业级日志分析系统ELK之集群工作原理
运维·开发语言·后端·python·elasticsearch·自动化·jenkins·哈希算法
ZHOUPUYU3 小时前
最新 neo4j 5.26版本下载安装配置步骤【附安装包】
java·后端·jdk·nosql·数据库开发·neo4j·图形数据库
Q_19284999064 小时前
基于Spring Boot的找律师系统
java·spring boot·后端
ZVAyIVqt0UFji5 小时前
go-zero负载均衡实现原理
运维·开发语言·后端·golang·负载均衡
谢家小布柔5 小时前
Git图形界面以及idea中集合Git使用
java·git
loop lee5 小时前
Nginx - 负载均衡及其配置(Balance)
java·开发语言·github