17.设计模式-ITERATOR(迭代器)

一、模式定义与核心价值

迭代器模式是一种行为型设计模式,其核心目标是提供一种统一的方式顺序访问聚合对象(如集合)中的元素,而无需暴露其内部实现细节。通过解耦遍历逻辑与数据结构,该模式赋予系统以下核心能力:

  1. 解耦访问与存储:客户端无需了解集合的底层结构(如数组、链表、树),即可完成遍历操作。
  2. 灵活扩展:支持多种遍历方式(正序、逆序、过滤)和复合数据结构(树形、图结构)的遍历。
  3. 单一职责原则:集合类专注于数据存储,迭代器类专注于遍历逻辑,职责分离提升代码可维护性。

工业级场景

  • Java集合框架中的Iterator接口(如ArrayList.iterator()
  • 文件系统目录树的递归遍历
  • 数据库查询结果的分页处理
  • 游戏引擎中粒子系统的状态遍历

二、模式组成与UML类图

核心角色
  1. Iterator(抽象迭代器)
    • 定义遍历元素的接口(hasNext()next()等)
  1. ConcreteIterator(具体迭代器)
    • 实现迭代逻辑,维护遍历位置状态(如ConcreteIterator类)
  1. Aggregate(抽象聚合)
    • 声明创建迭代器的方法(createIterator()iterator()
  1. ConcreteAggregate(具体聚合)
    • 管理元素集合,返回对应的具体迭代器(如BookShelf类)
UML类图
classDiagram
    class Iterator {
        <<interface>>
        +hasNext() boolean
        +next() Object
    }

    class ConcreteIterator {
        -collection: List
        -cursor: int
        +hasNext()
        +next()
    }

    class Aggregate {
        <<interface>>
        +createIterator() Iterator
    }

    class ConcreteAggregate {
        -items: List
        +createIterator()
    }

    Aggregate <|-- ConcreteAggregate
    Iterator <|-- ConcreteIterator
    ConcreteAggregate --> ConcreteIterator


三、代码实现示例

场景:实现支持正序/逆序遍历的书籍集合

1. 书籍类与抽象迭代器
// 书籍类
public class Book {
    private String name;
    public Book(String name) { this.name = name; }
    public String getName() { return name; }
}

// 抽象迭代器接口
public interface BookIterator {
    boolean hasNext();
    Book next();
}
2. 具体迭代器实现
// 正序迭代器
public class ForwardIterator implements BookIterator {
    private List<Book> books;
    private int index = 0;

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

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

    @Override
    public Book next() { 
        return books.get(index++); 
    }
}

// 逆序迭代器
public class ReverseIterator implements BookIterator {
    private List<Book> books;
    private int index;

    public ReverseIterator(List<Book> books) { 
        this.books = books;
        index = books.size() - 1;
    }

    @Override
    public boolean hasNext() { 
        return index >= 0; 
    }

    @Override
    public Book next() { 
        return books.get(index--); 
    }
}
3. 聚合类与客户端调用
// 书籍集合(聚合类)
public class BookShelf implements Iterable<Book> {
    private List<Book> books = new ArrayList<>();

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

    // 默认返回正序迭代器
    @Override
    public BookIterator iterator() { 
        return new ForwardIterator(books); 
    }

    // 扩展方法返回逆序迭代器
    public BookIterator reverseIterator() { 
        return new ReverseIterator(books); 
    }
}

// 客户端调用
public class Client {
    public static void main(String[] args) {
        BookShelf shelf = new BookShelf();
        shelf.addBook(new Book("设计模式"));
        shelf.addBook(new Book("算法导论"));

        System.out.println("正序遍历:");
        BookIterator it = shelf.iterator();
        while (it.hasNext()) {
            System.out.println(it.next().getName());
        }

        System.out.println("\n逆序遍历:");
        BookIterator reverseIt = shelf.reverseIterator();
        while (reverseIt.hasNext()) {
            System.out.println(reverseIt.next().getName());
        }
    }
}

输出结果

正序遍历:
设计模式
算法导论

逆序遍历:
算法导论
设计模式

四、工业级源码应用

  1. Java集合框架
  • java.util.Iterator接口与List.iterator()方法,如ArrayList.Itr内部类实现了正向遍历
List<String> list = Arrays.asList("A", "B", "C");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
    System.out.println(it.next());
}
  1. Spring Data分页查询
    • Page<T>接口的iterator()方法封装数据库分页结果遍历,隐藏JDBC游标细节。
  1. Android RecyclerView
    • RecyclerView.Adapter通过ViewHolder迭代器模式复用屏幕外的视图元素。
  1. Apache Commons Collections
    • FilterIterator支持条件过滤遍历,如筛选集合中大于特定值的元素。
  1. JUnit测试框架
    • TestSuite通过TestIterator遍历测试用例,支持多层级套件执行。

五、模式对比与选型建议

维度 迭代器模式 访问者模式
关注点 元素遍历 算法与数据结构分离
扩展方向 新增遍历方式(正序/逆序) 新增元素类型的处理逻辑
典型场景 集合类遍历、文件系统遍历 编译器AST处理、报表生成

最佳实践

  1. 优先使用语言内置迭代器(如Java的for-each循环)
  2. 复杂遍历场景扩展迭代器(如树形结构的广度优先遍历)
  3. 注意线程安全:多线程环境下需使用ConcurrentModificationException机制或同步控制

总结

迭代器模式通过封装遍历逻辑解耦数据结构,在Java集合框架、数据库访问等场景中展现出强大的普适性。其设计精髓在于将访问权与控制权分离,开发者应重点把控迭代器的扩展性与性能平衡,使其成为高复杂度数据处理的利器。

posted @ 2025-04-12 10:54  雾里看花的少年  阅读(19)  评论(0)    收藏  举报