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