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 接口和具体的迭代器类,我们可以轻松地遍历各种集合对象。不过,它也增加了一定的复杂性,特别是在处理大型集合时,可能会影响性能。

相关推荐
Java技术小馆5 分钟前
SpringBoot中暗藏的设计模式
java·面试·架构
xiguolangzi6 分钟前
《springBoot3 中使用redis》
java
Aniugel7 分钟前
JavaScript高级面试题
javascript·设计模式·面试
꧁坚持很酷꧂8 分钟前
配置Ubuntu18.04中的Qt Creator为中文(图文详解)
开发语言·qt·ubuntu
李菠菜13 分钟前
非SpringBoot环境下Jedis集群操作Redis实战指南
java·redis
不当菜虚困25 分钟前
JAVA设计模式——(四)门面模式
java·开发语言·设计模式
ruyingcai66666625 分钟前
用python进行OCR识别
开发语言·python·ocr
Niuguangshuo28 分钟前
Python设计模式:MVC模式
python·设计模式·mvc
BB_CC_DD29 分钟前
四. 以Annoy算法建树的方式聚类清洗图像数据集,一次建树,无限次聚类搜索,提升聚类搜索效率。(附完整代码)
深度学习·算法·聚类
m0Java门徒33 分钟前
面向对象编程核心:封装、继承、多态与 static 关键字深度解析
java·运维·开发语言·intellij-idea·idea