迭代器模式
今天要说的迭代器模式,实际上就是Java已经为我们实现好了,那就是Java的Iterator类。包括很多编程语言也有自己的迭代器类,但同时它也是一个设计模式,所以在我们实现迭代器模式的时候实际上就是在实现一个迭代器类。
我们先来了解何为迭代器?其实你把它简单理解为for循环也没什么问题,可以说是它是for循环的高级形式。它提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。我们为它提供开始、下一个、是否结束等方法。
定义一个迭代器接口,包含以下方法。
1 package day_28_iterator; 2 3 /** 4 * 迭代器接口 5 * @author turbo 6 * 7 * 2016年9月29日 8 */ 9 public interface Iterator { 10 Object first(); //第一个元素 11 Object next(); //下一个元素 12 boolean isFinished(); //是否到结尾 13 Object currentItem(); //当前遍历的对象 14 }
具体的迭代器类。
1 package day_28_iterator; 2 3 import java.util.Vector; 4 5 /** 6 * 具体迭代器类 7 * @author turbo 8 * 9 * 2016年9月29日 10 */ 11 public class ConcreteIterator implements Iterator { 12 private int currentIndex = 0; 13 private Vector vector = null; 14 15 public ConcreteIterator(Vector vector){ 16 this.vector = vector; 17 } 18 19 /* (non-Javadoc) 20 * @see day_28_iterator.Iterator#first() 21 */ 22 @Override 23 public Object first() { 24 currentIndex = 0; 25 return vector.get(currentIndex); 26 } 27 28 /* (non-Javadoc) 29 * @see day_28_iterator.Iterator#next() 30 */ 31 @Override 32 public Object next() { 33 return vector.get(currentIndex++); 34 } 35 36 /* (non-Javadoc) 37 * @see day_28_iterator.Iterator#isFinished() 38 */ 39 @Override 40 public boolean isFinished() { 41 if (currentIndex > this.vector.size() - 1){ 42 return true; 43 } else { 44 return false; 45 } 46 } 47 48 /* (non-Javadoc) 49 * @see day_28_iterator.Iterator#currentItem() 50 */ 51 @Override 52 public Object currentItem() { 53 return currentIndex; 54 } 55 56 }
定义一个聚合类接口,用来模拟集合。
1 package day_28_iterator; 2 3 /** 4 * 聚集(集合)接口,模拟集合接口,增删 5 * @author turbo 6 * 7 * 2016年9月29日 8 */ 9 public interface Aggregate { 10 Iterator createIterator(); //创建迭代器 11 void add(Object obj); //新增元素 12 void remove(Object obj); //删除元素 13 }
1 package day_28_iterator; 2 3 import java.util.Vector; 4 5 /** 6 * 具体聚集类 7 * @author turbo 8 * 9 * 2016年9月29日 10 */ 11 public class ConcreteAggregate implements Aggregate { 12 private Vector vector = null; 13 14 public void setVector(Vector vector) { 15 this.vector = vector; 16 } 17 public Vector getVector() { 18 return vector; 19 } 20 21 public ConcreteAggregate(){ 22 vector = new Vector(); 23 } 24 25 /* (non-Javadoc) 26 * @see day_28_iterator.Aggregate#createIterator() 27 */ 28 @Override 29 public Iterator createIterator() { 30 return new ConcreteIterator(vector); 31 } 32 /* (non-Javadoc) 33 * @see day_28_iterator.Aggregate#add(java.lang.Object) 34 */ 35 @Override 36 public void add(Object obj) { 37 this.vector.add(obj); 38 } 39 /* (non-Javadoc) 40 * @see day_28_iterator.Aggregate#remove(java.lang.Object) 41 */ 42 @Override 43 public void remove(Object obj) { 44 this.vector.remove(obj); 45 } 46 47 }
我们来看看客户端。
1 package day_28_iterator; 2 3 /** 4 * @author turbo 5 * 6 * 2016年9月29日 7 */ 8 public class Main { 9 10 /** 11 * @param args 12 */ 13 public static void main(String[] args) { 14 Aggregate agg = new ConcreteAggregate(); 15 agg.add("a"); 16 agg.add("b"); 17 agg.add("c"); 18 Iterator iterator = agg.createIterator(); 19 while (!iterator.isFinished()){ 20 System.out.println(iterator.next()); 21 } 22 23 } 24 25 }
这样我们就简单的实现了一个迭代器,当需要对聚集(集合)有多种方式遍历时,可以考虑用迭代器模式,在下一篇中,我们会去JDK源代码看看Java是如何实现Iterator迭代器类的。
不积跬步,无以至千里;不积小流,无以成江海。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?