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

相关推荐
0白露40 分钟前
Apifox Helper 与 Swagger3 区别
开发语言
Tanecious.2 小时前
机器视觉--python基础语法
开发语言·python
叠叠乐2 小时前
rust Send Sync 以及对象安全和对象不安全
开发语言·安全·rust
想跑步的小弱鸡2 小时前
Leetcode hot 100(day 3)
算法·leetcode·职场和发展
战族狼魂2 小时前
CSGO 皮肤交易平台后端 (Spring Boot) 代码结构与示例
java·spring boot·后端
Tttian6223 小时前
Python办公自动化(3)对Excel的操作
开发语言·python·excel
xyliiiiiL3 小时前
ZGC初步了解
java·jvm·算法
杉之4 小时前
常见前端GET请求以及对应的Spring后端接收接口写法
java·前端·后端·spring·vue
爱的叹息4 小时前
RedisTemplate 的 6 个可配置序列化器属性对比
算法·哈希算法
hycccccch4 小时前
Canal+RabbitMQ实现MySQL数据增量同步
java·数据库·后端·rabbitmq