集合这种结构特点就是数据量多,但是存储的结构很不一样,因此若想要对不同结构的数据进行遍历就需要针对每个集合的结构进行解析,然后写出遍历的代码,在这种情况下,若是有一个统一的东西来展示集合中的数据就再好不过了,用户需要遍历一个集合时,只需要调用迭代器获取想要的数据,无需关注其具体的实现细节,这就是迭代器模式
迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即不暴露其内部的结构。
借助HashMap来理解迭代器模式
如图
已知map结构是一种key-value结构,但是底层key-value的结构体现的是一个Entry实体,因此提供一个Entry的迭代器。另外或需要遍历所有key和value的需求,都提供了对应的iterator,这样使用该结构的人就无需灌注如何遍历,直接调用即可
举例EntryIterator
已知需要获取map中的entry集合需要调用
那么我们看下entrySet()的实现
若es是空的话,就new一个新的EntrySet,但是构造器中是无参的。具体看EntrySet类的实现,是一个静态内部类
其中关键的iterator()方法的实现如下
可以看出来返回的是一个迭代器EnttyIterator,迭代器中的泛型就是map中的数据
可以看出改迭代器就一个方法nextNode(),而由于当前类是内部类,因此可以直接调用到外部类HashIterator的nextNode()方法,那么啥时候用到呢这就需要看字节码了,我们试着编译
可以看见调用的就是迭代器获取每个元素,并且调用对应的next()方法,那么对应的keySet()和values()方法的核心方法就是各自的next()
都是有各自的迭代器,然后获取key或者value,返回一个个输出完成遍历
另外可以发现,debug每个entries是有的,这是因为他们都调用了基类的toString()方法。
而这段的实现逻辑就已经把对应的迭代器数据遍历打印了。
迭代器模式个人理解的总结,提供了一个遍历数据的统一接口,想要遍历数据,就利用对应的hasnext()和next()同一结构来处理,无需关注深层的代码细节,迭代器并不存储数据,他只提供一种统一的行为给用户,这也是被叫做行为型设计模式的原因!(理解尚且浅薄)