设计模式之迭代器模式
此模式看下图就知道了,用来遍历访问ArrayList中数据对象,而不会暴露内部逻辑。
在ArrayList中有一个迭代器,Itr,用来访问ArrayList中的数据。
一般调用方式如下,
List<String> list = new ArrayList<>();
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
把ArrayList源码提取出来,去掉和上面迭代无关的代码,变成如下样子,
public class ArrayList<E> implements List<E>{
private int size; //下面数组的长度
transient Object[] elementData;
public Iterator<E> iterator() {
return new Itr();
}
private class Itr implements Iterator<E> {
int cursor;
public boolean hasNext() {
return cursor != size; //当前游标没有到最大长度,表示还有下一个
}
public E next() {
int i = cursor;
Object[] elementData = ArrayList.this.elementData;
cursor = i + 1; //获取完数据后,游标下移一位
return (E) elementData[i];
}
}
}
从上面调用list.iterator()其实是获取了一个内部类,这个内部类用来通过next()遍历数组,而我们不用关心next()中是怎么实现的,只需要调用即可。
再看iterator()这个方法,是不是很像工厂方法,而ArrayList就是这个工厂,用来生产迭代器对象。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?