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

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


一、迭代器模式核心思想

核心目标 :提供一种方法顺序访问聚合对象中的元素,而不暴露其内部实现。如同导游带领游客参观景点,游客无需知道景点的组织方式,只需跟随导游即可遍历所有景点。


二、迭代器模式类图(Mermaid)

创建 <<interface>> Aggregate +createIterator() : Iterator ConcreteAggregate -items: List +createIterator() : Iterator +size() : int +get(int) : Item <<interface>> Iterator +hasNext() : boolean +next() : Object ConcreteIterator -aggregate: ConcreteAggregate -position: int +hasNext() : boolean +next() : Object Client


三、代码实现示例

1. 自定义集合迭代器

java 复制代码
// 迭代器接口
interface Iterator<T> {
    boolean hasNext();
    T next();
    void remove();
}

// 聚合接口
interface IterableCollection<T> {
    Iterator<T> createIterator();
}

// 具体集合:书架
class BookShelf implements IterableCollection<Book> {
    private List<Book> books = new ArrayList<>();
    
    public void addBook(Book book) {
        books.add(book);
    }
    
    public Book getBook(int index) {
        return books.get(index);
    }
    
    public int size() {
        return books.size();
    }
    
    @Override
    public Iterator<Book> createIterator() {
        return new BookShelfIterator(this);
    }
}

// 具体迭代器
class BookShelfIterator implements Iterator<Book> {
    private BookShelf bookShelf;
    private int position;
    
    public BookShelfIterator(BookShelf bookShelf) {
        this.bookShelf = bookShelf;
        this.position = 0;
    }
    
    @Override
    public boolean hasNext() {
        return position < bookShelf.size();
    }
    
    @Override
    public Book next() {
        Book book = bookShelf.getBook(position);
        position++;
        return book;
    }
    
    @Override
    public void remove() {
        throw new UnsupportedOperationException();
    }
}

// 书籍类
class Book {
    private String title;
    public Book(String title) { this.title = title; }
    public String getTitle() { return title; }
}

// 客户端调用
public class Client {
    public static void main(String[] args) {
        BookShelf shelf = new BookShelf();
        shelf.addBook(new Book("设计模式"));
        shelf.addBook(new Book("Java核心技术"));
        shelf.addBook(new Book("算法导论"));
        
        Iterator<Book> it = shelf.createIterator();
        while (it.hasNext()) {
            System.out.println(it.next().getTitle());
        }
        /* 输出:
           设计模式
           Java核心技术
           算法导论 */
    }
}

四、模式优缺点分析

✅ 优势

  • 解耦集合与遍历:客户端无需知道集合内部结构
  • 支持多种遍历方式:可定义不同迭代器(正序/逆序/过滤等)
  • 单一职责原则:集合管理数据,迭代器负责遍历
  • 并行遍历:支持多迭代器同时操作

❌ 缺点

  • 简单集合不适用:对小型集合可能过度设计
  • 性能开销:迭代器对象创建成本
  • 修改集合风险:遍历时修改集合可能导致异常

五、典型应用场景

  1. 集合框架:Java的List、Set、Map迭代器
  2. 树形结构遍历:二叉树/BFS/DFS迭代器
  3. 数据库查询:ResultSet遍历
  4. 文件系统:目录递归遍历
  5. 社交网络:好友关系遍历
  6. 游戏地图:网格单元遍历

六、Mermaid序列图(迭代过程)

Client Iterator Aggregate createIterator() Iterator hasNext() true next() get(position) Item Item loop while hasNext() hasNext() false Client Iterator Aggregate


七、迭代器模式 vs 其他模式

对比模式 核心区别
访问者模式 对集合元素执行操作,不控制遍历顺序
组合模式 处理树形结构,迭代器可遍历组合
工厂方法 用于创建迭代器对象

八、Java集合框架中的迭代器

Java迭代器层次结构

实现 <<interface>> Iterable +iterator() : Iterator <<interface>> Iterator +hasNext() +next() +remove() <<interface>> ListIterator +hasPrevious() +previous() +add() +set() ArrayList +iterator() Collection List


九、高级应用技巧

1. 过滤迭代器(只返回符合条件的元素)

java 复制代码
class FilterIterator<T> implements Iterator<T> {
    private Iterator<T> source;
    private Predicate<T> filter;
    private T nextItem;
    
    public FilterIterator(Iterator<T> source, Predicate<T> filter) {
        this.source = source;
        this.filter = filter;
        findNext();
    }
    
    private void findNext() {
        nextItem = null;
        while (source.hasNext()) {
            T item = source.next();
            if (filter.test(item)) {
                nextItem = item;
                break;
            }
        }
    }
    
    public boolean hasNext() {
        return nextItem != null;
    }
    
    public T next() {
        T result = nextItem;
        findNext();
        return result;
    }
}

// 使用示例
Iterator<Book> it = new FilterIterator<>(
    shelf.createIterator(), 
    book -> book.getTitle().contains("Java")
);

2. 并发安全迭代器

java 复制代码
class ConcurrentIterator<T> implements Iterator<T> {
    private final List<T> snapshot;
    private int position;
    
    public ConcurrentIterator(Collection<T> collection) {
        this.snapshot = new ArrayList<>(collection);  // 创建快照
    }
    
    public boolean hasNext() {
        return position < snapshot.size();
    }
    
    public T next() {
        return snapshot.get(position++);
    }
}

十、实际框架应用案例

Spring Data的Repository迭代

java 复制代码
Iterable<User> users = userRepository.findAll();
Iterator<User> it = users.iterator();
while (it.hasNext()) {
    User user = it.next();
    // 处理用户
}

Java Stream API(内部使用迭代器)

java 复制代码
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream()
     .filter(name -> name.length() > 4)
     .forEach(System.out::println);

十一、常见问题解答

Q1:如何在遍历时安全删除元素?

使用迭代器的remove()方法:

java 复制代码
Iterator<Book> it = shelf.createIterator();
while (it.hasNext()) {
    Book book = it.next();
    if (book.getTitle().contains("过期")) {
        it.remove();  // 安全删除
    }
}

Q2:如何实现双向遍历?

使用ListIterator:

java 复制代码
ListIterator<Book> it = books.listIterator();
it.next();           // 正向遍历
it.previous();       // 返回上一个
it.add(newBook);     // 添加元素

Q3:迭代器模式如何支持并行遍历?

java 复制代码
// 创建多个独立迭代器
Iterator<Book> it1 = shelf.createIterator();
Iterator<Book> it2 = shelf.createIterator();

// 线程1使用it1遍历
// 线程2使用it2遍历

如果你觉得文章对你有帮助的话,帮忙点个关注吧!谢谢啦

相关推荐
天诰8 分钟前
SA-K-11 检索会消失吗与四个未解问题
java·服务器·人工智能·python·机器学习·ai编程
这个昵称不容易4 小时前
SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在
java·springboot·毕设
计算机毕设定制辅导-无忧学长4 小时前
《基于微信小程序的居家医疗陪护预约系统设计与实现》
java·spring boot·微信小程序·uniapp·居家医疗陪护预约系统
文丑颜不良啊5 小时前
LeetCode2221~2240题目解析
java·leetcode
秋饼6 小时前
Computer Use Agent Java 落地实战:感知-行动循环、执行器与安全围栏生产级实现
java·ai·技术分享·后端开发
心若自由何处是束缚7 小时前
适配器模式:从原理到实战的完整指南
设计模式·适配器模式
文丑颜不良啊7 小时前
LeetCode2161~2180题目解析
java·leetcode
文丑颜不良啊9 小时前
LeetCode2141~2160题目解析
java·leetcode
LabVIEW开发9 小时前
LabVIEW 连接板:28 个端子怎么排,优先级怎么定
java·算法·labview
天天被压力10 小时前
【A股分钟级高频数据完全手册 #07】北交所历史分钟K线接口:京市Pro版分时批量
java·人工智能·python