设计模式14之迭代器模式

背景

首先我们来看一段代码:

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终极版)

另:点击【我的福利】有更多惊喜哦。

猜你喜欢

转载自blog.csdn.net/wujialv/article/details/109441778
今日推荐