遍历世界的通行证:迭代器模式的导航艺术

遍历世界的通行证:迭代器模式的导航艺术


一、当集合开始「躲猫猫」

你是否经历过这样的抓狂时刻?

想遍历好友列表,却发现有的用数组存、有的用链表存,代码里长满了forwhile的杂草;

试图查看购物车商品,却被get(3)getElementAt(5)等魔法下标绕晕...

迭代器模式就像一位万能导游------「别管景点怎么排队的,跟着我的小红旗走就行!」 让遍历集合像刷抖音一样丝滑,无需关心背后的算法黑魔法。


二、导游的导航手册(UML图)

java 复制代码
   ┌─────────────┐          ┌─────────────┐
   │  Aggregate  │          │  Iterator   │
   ├─────────────┤          ├─────────────┤
   │ +iterator() │<───────┐ │ +hasNext()  │
   └──────△──────┘       ├─┤ +next()     │
          │               │ └──────△──────┘
   ┌──────┴──────┐        │ ┌──────┴──────┐
   │  Concrete   │        │ │  Concrete   │
   │  Aggregate  │        │ │  Iterator   │
   └─────────────┘        │ └─────────────┘
                          └─────────────────┘
  • 景区(Aggregate):集合接口(比如你的微信好友列表)
  • 导游(Iterator):遍历导航器(拿着小红旗带路)
  • 主题乐园(ConcreteAggregate):具体集合(数组/链表/树等)
  • 讲解员(ConcreteIterator):具体遍历实现(深度优先/广度优先等)

三、代码世界的观光巴士(场景实战)

1. 创建景区(电视频道集合)
java 复制代码
interface TVChannelCollection {
    TVChannelIterator iterator(); // 获取导游
    void addChannel(String channel); // 新增景点
}

// 具体景区:有线电视频道
class CableTV implements TVChannelCollection {
    private String[] channels = new String[10];
    private int index = 0;

    public void addChannel(String channel) {
        channels[index++] = channel;
    }

    public TVChannelIterator iterator() {
        return new CableTVIterator(channels); // 分配导游
    }
}
2. 培训导游(迭代器实现)
java 复制代码
interface TVChannelIterator {
    boolean hasNext(); // 还有下一个景点吗?
    String next();     // 前往下个景点
}

// 有线电视导游
class CableTVIterator implements TVChannelIterator {
    private String[] channels;
    private int position;

    public CableTVIterator(String[] channels) {
        this.channels = channels;
    }

    public boolean hasNext() {
        return position < channels.length 
               && channels[position] != null;
    }

    public String next() {
        return channels[position++]; // 带游客前往下个频道
    }
}
3. 游客体验日
java 复制代码
public class Tourist {
    public static void main(String[] args) {
        TVChannelCollection tv = new CableTV();
        tv.addChannel("CCTV-1 综合");
        tv.addChannel("湖南卫视");
        tv.addChannel("Discovery");

        TVChannelIterator guide = tv.iterator();
        while(guide.hasNext()) {
            System.out.println("正在收看:" + guide.next());
        }
    }
}

四、迭代器 vs 暴走族:导游与自由行的区别

维度 迭代器模式 直接访问集合
遍历方式 统一接口,无关底层结构 需知悉集合内部结构
耦合度 低耦合(游客不管景点管理) 高耦合(游客自己查地图)
扩展性 易新增遍历算法 需修改所有访问代码
安全性 隐藏实现细节 暴露内部结构
现实类比 跟团游 自驾游

五、导航系统的真实战场

  1. Java集合框架

    java 复制代码
    List<String> list = new ArrayList<>();
    Iterator<String> it = list.iterator(); // 经典迭代器
  2. 数据库查询

    java 复制代码
    ResultSet rs = stmt.executeQuery();
    while(rs.next()) { ... } // 结果集迭代器
  3. 文件系统遍历:递归访问文件夹中的文件

  4. 社交网络:遍历用户的好友关系图

  5. XML解析:DOM树节点的遍历

冷知识

Java 5的foreach循环其实是迭代器的语法糖,编译后会自动转换为迭代器调用!


六、防迷路指南(最佳实践)

  1. 禁止在遍历时修改集合

    java 复制代码
    // 错误示范:边遍历边删除
    while(it.hasNext()) {
        String item = it.next();
        if(item.equals("垃圾广告")) {
            list.remove(item); // 抛出ConcurrentModificationException
        }
    }
  2. 为不同结构定制迭代器

    java 复制代码
    // 树结构的迭代器可以有:
    // 深度优先迭代器 / 广度优先迭代器
  3. 支持多种遍历方式

    java 复制代码
    interface MyList {
        Iterator forwardIterator();
        Iterator reverseIterator();
    }
  4. 空对象迭代器

    java 复制代码
    // 空集合返回空迭代器,避免NPE
    public Iterator emptyIterator() {
        return new Iterator() {
            public boolean hasNext() { return false; }
            public Object next() { throw new NoSuchElementException(); }
        };
    }
  5. 与组合模式联用

    java 复制代码
    // 遍历组合结构(如菜单和子菜单)
    interface MenuComponent {
        Iterator createIterator();
    }

七、环球旅行总结

迭代器模式让代码成为优雅的旅行家:

  • :用于解耦集合与遍历算法
  • :为不同集合结构提供统一接口
  • 不要:在迭代过程中修改集合
  • 不要:暴露集合的内部实现细节

当你在Java中轻松使用for-each循环时,请想起迭代器模式------那个在后台默默为你安排好一切行程的隐形导游!

相关推荐
我命由我123451 小时前
35.Java线程池(线程池概述、线程池的架构、线程池的种类与创建、线程池的底层原理、线程池的工作流程、线程池的拒绝策略、自定义线程池)
java·服务器·开发语言·jvm·后端·架构·java-ee
CopyLower2 小时前
分布式ID生成方案的深度解析与Java实现
java·开发语言·分布式
whoarethenext4 小时前
qt的基本使用
开发语言·c++·后端·qt
m0_684598535 小时前
如何开发英语在线训练小程序:从0到1的详细步骤
java·微信小程序·小程序·小程序开发
ml130185288745 小时前
开发一个环保回收小程序需要哪些功能?环保回收小程序
java·大数据·微信小程序·小程序·开源软件
zybishe6 小时前
免费送源码:Java+ssm+MySQL 酒店预订管理系统的设计与实现 计算机毕业设计原创定制
java·大数据·python·mysql·微信小程序·php·课程设计
anlogic7 小时前
Java基础 4.12
java·开发语言
weisian1518 小时前
Java常用工具算法-7--秘钥托管云服务2(阿里云 KMS)
java·安全·阿里云
草捏子8 小时前
主从延迟导致数据读不到?手把手教你架构级解决方案
后端
小马爱打代码8 小时前
设计模式:依赖倒转原则 - 依赖抽象,解耦具体实现
设计模式