背景
首先我们来看一段代码:
List<Member> memberList = listMember();
Iterator<Member> iterator = memberList.iterator();
while (iterator.hasNext()) {
Member next = iterator.next();
...
}
上面的代码是使用迭代器遍历List。我们来看看下面的遍历方法:
for (Member member : memberList) {
...
}
上面的遍历为直接遍历。
直接遍历是集合直接参与的遍历的过程中,这里的遍历方法与集合对象的耦合性太高了。如果我们在直接遍历中操作集合,就出现操作异常。
使用迭代器遍历,我们分离了集合对象与其遍历行为,客户端遍历集合时,是通过迭代器操作的,对客户端来说,隐藏了集合内部细节。使用迭代器遍历,我们在遍历集合的同时操作集合也不会有问题。
实际上迭代器遍历就是使用了迭代器模式。
什么是迭代器模式
“Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.(它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。)
”
迭代器模式主要有下面4个要素组成:
“”
抽象聚合(Aggregate)角色:定义存储、添加、删除聚合对象以及创建迭代器对象的接口。
具体聚合(ConcreteAggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。
抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、first()、next() 等方法。
具体迭代器(Concretelterator)角色:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。
迭代器模式结构图如下:
代码实现
Aggregate
public interface Aggregate {
void add(Object obj);
void remove(Object obj);
Iterator getIterator();
}
Iterator
public interface Iterator {
Object first();
Object next();
boolean hasNext();
}
ConcreteAggregate
ConcreteIterator
测试代码:
测试结果:
聚合的内容有:微信号:Lvshen_9 头条号:Lvshen的技术小屋 CSDN:Lvshen的技术小屋
First:微信号:Lvshen_9
关于迭代器模式的思考
在Java中,集合都提供了迭代器类。如果我们自己要写类似集合的聚合类时,我们就可以使用迭代器类。使用迭代器模式,聚合对象无需暴露内部细节可能被访问,这样保护了聚合对象数据的安全性。
其实在Java开发中,你可能会使用不到迭代器模式,因为在Java类库中,需要使用迭代器模式的类库都已经提供了迭代器类。
往期推荐
扫码二维码,获取更多精彩。或微信搜Lvshen_9,可后台回复获取资料
1.回复"java" 获取java电子书;
2.回复"python"获取python电子书;
3.回复"算法"获取算法电子书;
4.回复"大数据"获取大数据电子书;
5.回复"spring"获取SpringBoot的学习视频。
6.回复"面试"获取一线大厂面试资料
7.回复"进阶之路"获取Java进阶之路的思维导图
8.回复"手册"获取阿里巴巴Java开发手册(嵩山终极版)
9.回复"总结"获取Java后端面试经验总结PDF版
10.回复"Redis"获取Redis命令手册,和Redis专项面试习题(PDF)
11.回复"并发导图"获取Java并发编程思维导图(xmind终极版)
另:点击【我的福利】有更多惊喜哦。