惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园 - 三生石上(FineUI控件)
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
B
Blog
D
DataBreaches.Net
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
V
Vulnerabilities – Threatpost
Jina AI
Jina AI
T
Threat Research - Cisco Blogs
The Hacker News
The Hacker News
Latest news
Latest news
博客园_首页
T
Tenable Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
酷 壳 – CoolShell
酷 壳 – CoolShell
Apple Machine Learning Research
Apple Machine Learning Research
Spread Privacy
Spread Privacy
Martin Fowler
Martin Fowler
Y
Y Combinator Blog
P
Privacy & Cybersecurity Law Blog
C
Cisco Blogs
I
InfoQ
The Cloudflare Blog
J
Java Code Geeks
C
Cybersecurity and Infrastructure Security Agency CISA
量子位
P
Proofpoint News Feed
C
Cyber Attacks, Cyber Crime and Cyber Security
Last Week in AI
Last Week in AI
T
Tailwind CSS Blog
AWS News Blog
AWS News Blog
Stack Overflow Blog
Stack Overflow Blog
Hugging Face - Blog
Hugging Face - Blog
The Register - Security
The Register - Security
M
MIT News - Artificial intelligence
G
Google Developers Blog
Simon Willison's Weblog
Simon Willison's Weblog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
T
The Exploit Database - CXSecurity.com
A
Arctic Wolf
D
Darknet – Hacking Tools, Hacker News & Cyber Security
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
Visual Studio Blog
Project Zero
Project Zero
P
Privacy International News Feed
Engineering at Meta
Engineering at Meta
G
GRAHAM CLULEY
博客园 - Franky
C
CERT Recently Published Vulnerability Notes

博客园 - daidaidaiyu

ZooKeepper 一文入门 ThingsBoard 规则链系统源码分析和自定义定时器 嵌入式开发入门知识 一文入门和实践Kafka 一文学习入门 ThingsBoard 开源物联网平台 Claude Code 使用一则 JMS, ActiveMQ 学习一则 Nacos实例一则及其源码环境搭建 一文学习 工作流开发 BPMN、 Flowable 一文学习 Spring 声明式事务源码全流程总结 Spring IOC 源码学习 事务增强相关的对象创建 Spring IOC 源码学习 事务相关的 BeanDefinition 解析过程 (XML) GIS 核心知识 Spring IOC 源码学习 声明式事务的入口点 23.行为型 - 访问者模式 (Visitor Pattern) 一文学习 Spring AOP 源码全过程 21.行为型 - 状态模式 (State Pattern) Netty 核心知识 SpringCloud 微服务实现一则 (Eureka + Hystrix) 20.行为型 - 责任链模式(ChainofResponsibility Pattern) Modbus 协议 学习一则 - daidaidaiyu 19.行为型 - 策略模式(Strategy Pattern) - daidaidaiyu Redis 学习一则 - daidaidaiyu Android NDK 开发一则 - daidaidaiyu
22.行为型 - 迭代器模式 (Iterator Pattern)
daidaidaiyu · 2026-02-22 · via 博客园 - daidaidaiyu

迭代器模式 (Iterator Pattern)

迭代器模式是我们学习一个设计时很少用到的、但编码实现时却经常使用到的行为型设计模式。在绝大多数编程语言中, 迭代器已经成为一个基础的类库, 直接用来遍历集合对象。在平时开发中, 我们更多的是直接使用它, 很少会从零去实现一个迭代器。

迭代器模式(Iterator pattern)又叫游标(Cursor)模式, 它的原始定义是:迭代器提供一种对容器对象中的各个元素进行访问的方法, 而又不需要暴露该对象的内部细节。

UML类图

Pasted image 20231208120347

代码实例

1.迭代器抽象

public interface Iterator {
   public boolean hasNext();
   public Object next();
}

2.容器接口 提供获取迭代器方法

public interface Container {
   public Iterator getIterator();
}

3.容器实现 和 迭代器 实现

public class NameRepository implements Container {
   public String[] names = {"Robert" ,  "John" , "Julie" ,  "Lora"};
 
   @Override
   public Iterator getIterator() {
      return new NameIterator();
   }
   
   //迭代器实现,  限制数据只能内部访问;
   private class NameIterator implements Iterator {
      int index = 0;
      @Override
      public boolean hasNext() {
         if(index < names.length){
            return true;
         }
         return false;
      }
      // 返回下一个元素,  并且游标向下移动
      @Override
      public Object next() {
         if(this.hasNext()){
            return names[index++];
         }
         return null;
      }     
   }
}

4.测试

public static void main(String[] args) {
   NameRepository namesRepository = new NameRepository();
   for(Iterator iter = namesRepository.getIterator(); iter.hasNext();){
      String name = (String)iter.next();
      System.out.println("Name : " + name);
   }  
}

迭代器模式总结

关键角色

  1. 抽象集合(Aggregate)角色:用于存储和管理元素对象, 定义存储、添加、删除集合元素的功能, 并且声明了一个createIterator()方法用于创建迭代器对象。
  2. 具体集合(ConcreteAggregate)角色:实现抽象集合类, 返回一个具体迭代器的实例。
  3. 抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口, 通常包含 hasNext()、next() 等方法。
    • hasNext()函数用于判断集合中是否还有下一个元素
    • next() 函数用于将游标后移一位元素
    • currentItem() 函数, 用来返回当前游标指向的元素
  4. 具体迭代器(Concretelterator)角色:实现抽象迭代器接口中所定义的方法, 完成对集合对象的遍历, 同时记录遍历的当前位置。

迭代器模式优缺点

1) 迭代器的优点:

  • 迭代器模式支持以不同方式遍历一个集合对象, 在同一个集合对象上可以定义多种遍历方式. 在迭代器模式中只需要用一个不同的迭代器来替换原有的迭代器, 即可改变遍历算法, 也可以自己定义迭代器的子类以支持新的遍历方式.
  • 迭代器简化了集合类。由于引入了迭代器, 在原有的集合对象中不需要再自行提供数据遍历等方法, 这样可以简化集合类的设计。
  • 在迭代器模式中, 由于引入了抽象层, 增加新的集合类和迭代器类都很方便, 无须修改原有代码, 满足 "基于接口编程而非实现" 和 "开闭原则" 的要求。

2) 迭代器的缺点:

  • 由于迭代器模式将存储数据和遍历数据的职责分离, 增加了类的个数, 这在一定程度上增加了系统的复杂性。
  • 抽象迭代器的设计难度较大, 需要充分考虑到系统将来的扩展.`

迭代器模式适用场景

  • 减少程序中重复的遍历代码

    对于放入一个集合容器中的多个对象来说, 访问必然涉及遍历算法。如果我们不将遍历算法封装到容器里(比如, List、Set、Map 等), 那么就需要使用容器的人自行去实现遍历算法, 这样容易造成很多重复的循环和条件判断语句出现, 不利于代码的复用和扩展, 同时还会暴露不同容器的内部结构。而使用迭代器模式是将遍历算法作为容器对象自身的一种“属性方法”来使用, 能够有效地避免写很多重复的代码, 同时又不会暴露内部结构。

  • 当需要为遍历不同的集合结构提供一个统一的接口时或者当访问一个集合对象的内容而无须暴露其内部细节的表示时。

    迭代器模式把对不同集合类的访问逻辑抽象出来, 这样在不用暴露集合内部结构的情况下, 可以隐藏不同集合遍历需要使用的算法, 同时还能够对外提供更为简便的访问算法接口。