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

⚪迭代器模式(Iterator)是一种行为型设计模式,这种模式非常有用,因为它允许在不知道集合内部结构的情况下遍历元素。

⚪意图:它用于提供一种访问集合对象元素的方式,而无需暴露底层的数据结构。

⚪以下是工厂方法模式的关键要点:

        ▷ 角色和责任

 

  1. 迭代器(Iterator):这是一个接口,定义了遍历集合元素的方法。通常包括 hasNext() 用于检查是否还有下一个元素,以及 next() 用于获取下一个元素。
  2. 具体迭代器(Concrete Iterator):实现了迭代器接口,负责实际遍历集合元素的工作。
  3. 集合(Aggregate):这是一个接口,定义了创建迭代器的方法,通常是 iterator()。
  4. 具体集合(Concrete Aggregate):实现了集合接口,负责创建具体迭代器的对象。

 

        ▷ 工作流程

 

  1. 客户端通过调用集合的 iterator() 方法获取迭代器对象。
  2. 客户端使用迭代器对象的 hasNext() 方法来检查是否还有下一个元素。
  3. 如果有下一个元素,客户端使用迭代器对象的 next() 方法获取下一个元素。
  4. 客户端重复步骤 2 和 3,直到遍历完集合中的所有元素。

 

        ▷ 示例

import java.util.*;

class Book {
    private String title;

    public Book(String title) {
        this.title = title;
    }

    public String getTitle() {
        return title;
    }
}

//迭代器接口
interface Iterator {
    boolean hasNext();
    Object next();
}

//集合接口
interface Aggregate {
    Iterator iterator();
}

//具体的迭代器
class BookIterator implements Iterator {
    private List<Book> books;
    private int position = 0;

    public BookIterator(List<Book> books) {
        this.books = books;
    }

    @Override
    public boolean hasNext() {
        return position < books.size();
    }

    @Override
    public Object next() {
        if (this.hasNext()) {
            return books.get(position++);
        } else {
            return null;
        }
    }
}
//书籍集合类
class BookCollection implements Aggregate {
    private List<Book> books = new ArrayList<>();

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

    @Override
    public Iterator iterator() {
        return new BookIterator(books);
    }
}

public class IteratorDemo {
    public static void main(String[] args) {
        BookCollection bookCollection = new BookCollection();
        bookCollection.addBook(new Book("Design Patterns"));
        bookCollection.addBook(new Book("Clean Code"));
        bookCollection.addBook(new Book("Java Programming"));

        Iterator iterator = bookCollection.iterator();
        while (iterator.hasNext()) {
            Book book = (Book) iterator.next();
            System.out.println("Book Title: " + book.getTitle());
        }
    }
}

⚪适用性

  1. 访问一个聚合对象的内容而无须暴露它的内部表示支持对聚合对象的多种遍历
  2. 为遍历不同的聚合结构提供一个统一的接口。

⚪应用场景

  1. 遍历集合或容器:最典型的用法是用于遍历数组、列表、集合或其他容器中的元素,无需暴露底层数据结构。
  2. 访问数据库查询结果:当从数据库中检索大量数据时,可以使用迭代器模式逐个处理结果集,而不是一次性加载所有数据。
  3. 解析复杂数据结构:在解析复杂的数据结构(如 JSON 或 XML)时,迭代器可以用来逐个处理数据元素,而不必一次性将整个数据结构加载到内存中。
  4. 文件系统遍历:用于遍历文件系统中的文件和目录,特别是在需要递归遍历文件夹时。
  5. 游戏开发:在游戏开发中,迭代器模式可用于遍历游戏世界中的对象,如游戏角色、敌人、子弹等。

⚪实际已有场景

  1. 集合框架(Collection Framework):Java 的集合框架包括 ArrayList、HashSet、LinkedList 等,它们都提供了迭代器(Iterator)来遍历集合元素。
  2. IO 流:在处理文件读取、网络数据流时,通常也会使用迭代器模式来逐个处理数据块。
  3. Spring Data:Spring Data 是 Spring 生态系统中的一个项目,用于简化数据访问。Spring Data JPA 和 Spring Data MongoDB 等模块使用迭代器模式来访问和遍历数据库查询结果,尤其是在处理大量数据时。
  4. Spring Batch:Spring Batch 是 Spring 提供的用于批处理的框架,它通常用于处理大规模数据集。在读取、处理和写入数据时,Spring Batch 使用迭代器模式来逐个处理数据块,以减小内存开销。
  5. Spring Integration:Spring Integration 是一个用于构建企业集成应用程序的框架,它可以处理各种数据源。在处理消息通道或事件流时,Spring Integration 使用迭代器模式来逐个处理消息或事件。

 

posted @ 2023-10-04 13:04  xiaogh  阅读(80)  评论(0)    收藏  举报