vlambda博客
学习文章列表

Java-104-设计模式-19-迭代器模式

        迭代器模式(Iterator Pattern)就是不需要知道集合对象的底层内部逻辑,只通过访问一个方法就可以顺序访问集合对象的各个元素。属于行为型模式。

        这玩意我们在日常开发中是一直在使用的,也正因为太常用,Java内部已经提供了这个接口:util包下的Iterator接口,实现这个接口就可以得到一个迭代器。

        那么得到了这个迭代器后,我们怎么用到要遍历的类上呢?这里就又涉及到另外一个接口:lang包下的Iterable接口

Java-104-设计模式-19-迭代器模式

        上图那句可以看到,Iterator<T> iterator()方法就是要return一个迭代器啦,这两个接口配合使用,我们就可以对我们的类进行迭代来获取类的内部元素啦。

        这里直接看常用的ArrayList就可以,看源码:

ArrayList是Collection的继承类,统一由Collection实现了Iterable接口

Java-104-设计模式-19-迭代器模式

然后来看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("第三个元素"); }@Overridepublic Iterator<String> iterator() {return new MyIterator(); }/** * 内部类是一个迭代器哈 * @author xing * @createTime */private class MyIterator implements Iterator<String> {int index = 0;@Overridepublic boolean hasNext() {return index < strList.size()? true :false; }@Overridepublic 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