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