前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >设计模式14之迭代器模式

设计模式14之迭代器模式

作者头像
Lvshen
发布2022-05-05 17:47:50
发布2022-05-05 17:47:50
14400
代码可运行
举报
运行总次数:0
代码可运行

背景

首先我们来看一段代码:

代码语言:javascript
代码运行次数:0
运行
复制
List<Member> memberList = listMember();
Iterator<Member> iterator = memberList.iterator();
while (iterator.hasNext()) {
    Member next = iterator.next();
    ...
}

上面的代码是使用迭代器遍历List。我们来看看下面的遍历方法:

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
public interface Aggregate {
    void add(Object obj);
    void remove(Object obj);
    Iterator getIterator();
}

Iterator

代码语言:javascript
代码运行次数:0
运行
复制
public interface Iterator {
    Object first();
    Object next();
    boolean hasNext();
}

ConcreteAggregate

ConcreteIterator

测试代码:

测试结果:

代码语言:javascript
代码运行次数:0
运行
复制
聚合的内容有:微信号:Lvshen_9 头条号:Lvshen的技术小屋 CSDN:Lvshen的技术小屋 
First:微信号:Lvshen_9

关于迭代器模式的思考

在Java中,集合都提供了迭代器类。如果我们自己要写类似集合的聚合类时,我们就可以使用迭代器类。使用迭代器模式,聚合对象无需暴露内部细节可能被访问,这样保护了聚合对象数据的安全性。

其实在Java开发中,你可能会使用不到迭代器模式,因为在Java类库中,需要使用迭代器模式的类库都已经提供了迭代器类。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Lvshen的技术小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 什么是迭代器模式
  • 代码实现
    • Aggregate
    • Iterator
  • ConcreteAggregate
  • ConcreteIterator
  • 关于迭代器模式的思考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档