迭代器模式探究 - 那拗口的定义说的是啥呀
前言
最近捡起了一直没看完的设计模式
一篇篇理论看过去对我这种菜鸡来说难免如雾里看花
为了学(饭)习(碗),我忍了
看到迭代器模式(Iterator Pattern),我忍不了了
迭代器模式允许我们访问一个聚合对象中各个元素,而又无须暴露该对象的内部表示
内部表示是什么鬼?才疏学浅的我只会表示不理解
害,看看英文文档吧
the iterator pattern allow us to access contents of a collection without exposing its internal structure
internal structure ???
弃坑!
到底是啥
平复心情后
既然学了,还是弄懂吧
看了看迭代器模式的主要实现示例、使用示例
/*
* 主要实现
*/
public class NameRepository implements Container {
public String[] names = {"Robert", "John", "Julie", "Lora"};
@Override
public Iterator getIterator() {
return new NameIterator();
}
private class NameIterator implements Iterator {
int index;
@Override
public boolean hasNext() {
if (index < names.length) {
return true;
}
return false;
}
@Override
public Object next() {
if (this.hasNext()) {
return names[index++];
}
return null;
}
}
}
/*
* 使用示例
*/
public static void main(String[] args) {
Container nameRepository = new NameRepository();
Iterator iterator = nameRepository.getIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
这就是通过 iterator 遍历 names 数组啊。再看一遍文档
the iterator pattern allow us to access contents of a collection without exposing its internal structure
access contents of a collection 当然是指获取 names 中的元素
without exposing its internal structure 在main()
中确实没有获取 names,但实现了对 names 的遍历
所以
所谓的 internal structure 指的就是这个 names
吗?
结论
先说结论:是的
更专业点的说法:internal structure 是class
中保存集合数据的私有成员变量
举例
Java 中很好的实现了 iterator,我们以 java.util.ArrayList、java.util.HashSet 为例
java.util.ArrayList
先看 ArrayList 实现的 iterator 方法
可以看到next()
最终获取的是 ArrayList.this.elementData 中的元素,再看 ArrayList.this.elementData
我们日常开发遍历 ArrayList 时,从没直接操作过 elementData 这个私有变量吧?这个elementData
就是 java.util.ArrayList 的 internal structure
java.util.HashSet
我们再看 HashSet 实现的 iterator 方法
同样的,map
就是 java.util.HashSet 的 internal structure。日常开发中,我们使用 set.iterator() 遍历 HashSet,而不是直接操作这个 HashMap 类型的 map
// 遍历HashSet示例
Set<String> set = new HashSet<>();
...
Iterator iterator = set.iterator();
总结
迭代器模式(Iterator)中所谓的“内部表示(internal structure)”,其实就是指class
中存储集合数据的private
变量
所谓的“无须暴露该对象的内部表示”,就是说仅开发使用的话,我们无需关心这个class
内部是怎么维护、怎么来读取集合数据的
感谢阅读,不喜勿喷。欢迎讨论、指正
转载自:https://juejin.cn/post/7216252920769101884