遍历世界的通行证:迭代器模式的导航艺术
一、当集合开始「躲猫猫」
你是否经历过这样的抓狂时刻?
想遍历好友列表,却发现有的用数组存、有的用链表存,代码里长满了for
和while
的杂草;
试图查看购物车商品,却被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 暴走族:导游与自由行的区别
维度 | 迭代器模式 | 直接访问集合 |
---|---|---|
遍历方式 | 统一接口,无关底层结构 | 需知悉集合内部结构 |
耦合度 | 低耦合(游客不管景点管理) | 高耦合(游客自己查地图) |
扩展性 | 易新增遍历算法 | 需修改所有访问代码 |
安全性 | 隐藏实现细节 | 暴露内部结构 |
现实类比 | 跟团游 | 自驾游 |
五、导航系统的真实战场
-
Java集合框架:
javaList<String> list = new ArrayList<>(); Iterator<String> it = list.iterator(); // 经典迭代器
-
数据库查询:
javaResultSet rs = stmt.executeQuery(); while(rs.next()) { ... } // 结果集迭代器
-
文件系统遍历:递归访问文件夹中的文件
-
社交网络:遍历用户的好友关系图
-
XML解析:DOM树节点的遍历
冷知识 :
Java 5的foreach
循环其实是迭代器的语法糖,编译后会自动转换为迭代器调用!
六、防迷路指南(最佳实践)
-
禁止在遍历时修改集合:
java// 错误示范:边遍历边删除 while(it.hasNext()) { String item = it.next(); if(item.equals("垃圾广告")) { list.remove(item); // 抛出ConcurrentModificationException } }
-
为不同结构定制迭代器:
java// 树结构的迭代器可以有: // 深度优先迭代器 / 广度优先迭代器
-
支持多种遍历方式:
javainterface MyList { Iterator forwardIterator(); Iterator reverseIterator(); }
-
空对象迭代器:
java// 空集合返回空迭代器,避免NPE public Iterator emptyIterator() { return new Iterator() { public boolean hasNext() { return false; } public Object next() { throw new NoSuchElementException(); } }; }
-
与组合模式联用:
java// 遍历组合结构(如菜单和子菜单) interface MenuComponent { Iterator createIterator(); }
七、环球旅行总结
迭代器模式让代码成为优雅的旅行家:
- ✅ 要:用于解耦集合与遍历算法
- ✅ 要:为不同集合结构提供统一接口
- ❌ 不要:在迭代过程中修改集合
- ❌ 不要:暴露集合的内部实现细节
当你在Java中轻松使用for-each
循环时,请想起迭代器模式------那个在后台默默为你安排好一切行程的隐形导游!