设计模式- 迭代器模式
Gof定义
提供一种方法顺序访问一个聚合对象中的各个元素, 而又不暴露该对象的内部表示。
理解
我们实际上经常用到迭代器模式,例如FOREACH语句,就是对迭代器模式的实现,泛型像LIST也是对迭代器模式的实现。关于迭代器模式在实际应用中很广泛,但他已经渐渐的融入到我们的编程语言语法中的其中一部份,所以实际上可能不需要再自己要动手写一个迭代器模式了。
但是大概去了解一下内部实现原理,我觉的还是很值得的。
示例代码

/// <summary> /// 集合结构接口 /// </summary> public interface Aggregate { Iterator CreateIterator(); } /// <summary> /// 迭代器接口 /// </summary> public interface Iterator { object First(); object Next(); bool IsDone(); object CurrentItem(); } /// <summary> /// 集合结构的具体类 /// </summary> class ConcreteAggregate : Aggregate { private List<object> items = new List<object>(); public Iterator CreateIterator() { return new ConcreteIterator(this); } public int Count { get { return items.Count; } } public object this[int index] { get { return items[index]; } set { items.Insert(index, value); } } } /// <summary> /// 具体的迭代器类 /// </summary> class ConcreteIterator : Iterator { private ConcreteAggregate _aggregate; private int _current = 0; public ConcreteIterator(ConcreteAggregate aggregate) { this._aggregate = aggregate; } public object First() { return _aggregate[0]; } public object Next() { object r = null; _current++; if (_current < _aggregate.Count) { r = _aggregate[_current]; } return r; } public bool IsDone() { return _current >= _aggregate.Count ? true : false; } public object CurrentItem() { return _aggregate[_current]; } } /// <summary> /// 客户端调用 /// </summary> class Program { static void Main(string[] args) { ConcreteAggregate ca = new ConcreteAggregate(); ca[0] = "AspNet3.5 揭秘"; ca[0] = "重构:改善既有代码的设计"; ca[2] = "设计模式"; ca[3] = "人月神话"; ca[4] = "代码大全2"; Iterator i = new ConcreteIterator(ca); while (!i.IsDone()) { Console.WriteLine("要读的书:" + i.CurrentItem()); i.Next(); } } }
去掉Aggregate类,简单实现

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { ConcreteAggregate ca = new ConcreteAggregate(); ca[0] = "高等数学"; ca[1] = "C语言程序设计"; ca[2] = "操作系统"; ca[3] = "数据结构"; ca[4] = "算法原理"; ca[5] = "编译原理"; Iterator i = new ConcreteIterator(ca); while (i.IsDone()) { Console.WriteLine("要读的书:" + i.CurrentItem()); i.Next(); } Console.ReadLine(); } } public interface Iterator { object First(); void Next(); bool IsDone(); object CurrentItem(); } class ConcreteAggregate { private List<object> items = new List<object>(); public int Count { get { return items.Count; } } public object this[int index] { get { return items[index]; } set { items.Insert(index, value); } } } class ConcreteIterator : Iterator { private ConcreteAggregate _aggregate; private int _current = 0; public ConcreteIterator(ConcreteAggregate aggregate) { this._aggregate = aggregate; } public object First() { return _aggregate[0]; } public void Next() { if(_current < _aggregate.Count) _current++; } public bool IsDone() { if (_current < _aggregate.Count) { return true; } else { return false; } } public object CurrentItem() { return _aggregate[_current]; } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具