迭代器模式(Iterator Pattern)就是不需要知道集合对象的底层内部逻辑,只通过访问一个方法就可以顺序访问集合对象的各个元素。属于行为型模式。
这玩意我们在日常开发中是一直在使用的,也正因为太常用,Java内部已经提供了这个接口:util包下的Iterator接口,实现这个接口就可以得到一个迭代器。
图片
那么得到了这个迭代器后,我们怎么用到要遍历的类上呢?这里就又涉及到另外一个接口:lang包下的Iterable接口
上图那句可以看到,Iterator<T> iterator()方法就是要return一个迭代器啦,这两个接口配合使用,我们就可以对我们的类进行迭代来获取类的内部元素啦。
这里直接看常用的ArrayList就可以,看源码:
ArrayList是Collection的继承类,统一由Collection实现了Iterable接口
然后来看ArrayList的源码:
我们要让自定义的类支持迭代怎么实现呢?
1.建一个实现了Iterable的类packagecom.xing.design.iterator; importjava.util.ArrayList; importjava.util.Iterator; importjava.util.List; /*** 相当于List,可以迭代* @author xing* @createTime*/publicclassMyListimplementsIterable<String>{ privatefinalList<String>strList=newArrayList<>(); publicMyList() { strList.add("第一个元素"); strList.add("第二个元素"); strList.add("第三个元素"); } publicIterator<String>iterator() { returnnewMyIterator(); } /*** 内部类是一个迭代器哈* @author xing* @createTime*/privateclassMyIteratorimplementsIterator<String> { intindex=0; publicbooleanhasNext() { returnindex<strList.size()?true :false; } publicStringnext() { Stringstr=strList.get(index); index++; returnstr; } } } 2.编写main方法测试packagecom.xing.design.iterator; importjava.util.Iterator; publicclassIteratorDemo { publicstaticvoidmain(String[] args) { MyListmyList=newMyList(); // 获取我们得到的那个迭代器Iterator<String>iterator=myList.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } for (Stringstr : myList) { System.out.println(str); } } }
3.测试结果
完美,就这么简单。。。
总结:
迭代器模式在Java中很常用,我们使用Collection系列的集合基本上已经能满足大部分情况。如果要自定义类迭代就实现Iterable接口。
迭代器模式分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。
END