迭代器模式

迭代器模式

迭代器模式是一种行为型设计模式,它提供了一种统一的方式来访问集合对象中的元素,而不是暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。

角色组成
抽象迭代器(Iterator):定义了遍历聚合对象所需的方法,包括hashNext()和next()方法等,用于遍历聚合对象中的元素。
具体迭代器(Concrete Iterator):它是实现迭代器接口的具体实现类,负责具体的遍历逻辑。它保存了当前遍历的位置信息,并可以根据需要向前或向后遍历集合元素。
抽象聚合器(Aggregate): 一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等。
具体聚合器(ConcreteAggregate):就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。

image-20231229170702241

抽象迭代器

1
2
3
4
5
6
7
public interface Iterator {
public Object getFirst();
public void next();
public Object currentItem();
public boolean hasNext();
}

具体迭代器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class ConcreteIterator implements Iterator{
private List<Object> list;
private int cursor;

public ConcreteIterator(ConcreteAggregate concreteAggregate){
this.list = concreteAggregate.list;
cursor = 0;
}

@Override
public Object getFirst() {
return list.get(0);
}

@Override
public void next() {
if(cursor<list.size()){
cursor++;
}
}

@Override
public Object currentItem() {
return list.get(cursor);
}

@Override
public boolean hasNext() {
return (cursor != list.size());
}
}

抽象聚合类

1
2
3
4
5
6
7
public abstract class Aggregate {
protected List<Object> list = new ArrayList<>();
public Aggregate(List<Object> list){
this.list = list;
}
public abstract Iterator createIteraor();
}

具体聚合类

1
2
3
4
5
6
7
8
9
10
public class ConcreteAggregate extends Aggregate{
public ConcreteAggregate(List<Object> list){
super(list);
}
@Override
public Iterator createIteraor() {
//实现创建迭代器对象的具体工厂方法
return new ConcreteIterator(this);
}
}

客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Client {
public static void main(String[] args) {
List<Object> products = new ArrayList<>();
products.add("倚天剑");
products.add("屠龙刀");
products.add("风火轮");

Aggregate aggregate = new ConcreteAggregate(products);
Iterator iterator = aggregate.createIteraor();

while (iterator.hasNext()){
System.out.println(iterator.currentItem() + " ");
iterator.next();
}
}
}

测试

1
2
3
倚天剑 
屠龙刀
风火轮

优点:

简化了集合类的接口,使用者可以更加简单地遍历集合对象,而不需要了解集合内部结构和实现细节。
将集合和遍历操作解耦,使得我们可以更灵活地使用不同的迭代器来遍历同一个集合,根据需求选择不同的遍历方式。
满足开闭原则,如果需要增加新的遍历方式,只需实现一个新的具体迭代器即可,不需要修改原先聚合对象的代码。

缺点:

具体迭代器实现的算法对外不可见,因此不利于调试和维护。
对于某些小型、简单的集合对象来说,使用迭代器模式可能会显得过于复杂,增加了代码的复杂性。

应用场景

生活场景
遍历班级名单:假设你是一名班主任,你需要遍历班级名单来点名。班级名单可以看作是一个集合,每个学生名字可以看作是集合中的一个元素。使用迭代器模式,你可以通过迭代器对象逐个访问学生的名字,而不需要了解班级名单的具体实现细节。

遍历音乐播放列表:当我们在手机或电脑上播放音乐时,通常会创建一个播放列表。播放列表可以被视为一个集合,每首歌曲可以被视为集合中的一个元素。使用迭代器模式,我们可以通过迭代器对象逐个访问播放列表中的歌曲,进行播放、暂停或切歌等操作。
java场景
集合框架中的迭代器:在Java中,集合包括List、Set、Map等等,每个集合类中都提供了一个获取迭代器的方法,例如List提供的iterator()方法、Set提供的iterator()方法等等。通过获取对应的迭代器对象,可以对集合中的元素进行遍历和访问。

JDBC中的ResultSet对象:在Java中,如果需要对数据库中的数据进行遍历和访问,可以使用JDBC操作数据库。JDBC中,查询结果集使用ResultSet对象来表示,通过使用ResultSet的next()方法,就可以像使用迭代器一样遍历和访问查询结果中的数据。

文件读取:在Java中,我们可以使用BufferedReader类来读取文本文件。BufferedReader类提供了一个方法readLine()来逐行读取文件内容。实际上,BufferedReader在内部使用了迭代器模式来逐行读取文本文件的内容。


迭代器模式
http://example.com/2023/10/15/计算机基础/设计模式/19-迭代器模式/
作者
PALE13
发布于
2023年10月15日
许可协议