设计模式之迭代器模式

设计模式之迭代器模式

迭代器是一种行为模式,它提供一种顺序访问聚合对象元素的方法,而不会暴露其基础表示。

应用场景

  • 指向访问集合对象内容,而不暴露其内部实现。
  • 可以对集合对象多次遍历
  • 为不同集合对象提供统一的遍历接口

模式结构

迭代器模式大致分为四个角色:抽象容器,具体容器,抽象迭代器,具体迭代器。结构图如下:

结构图

容器一般为一种数据结构的类,例如list、map。 迭代器是提供遍历这个数据结构的方法的类。

代码

在java中提供很多Iterator的模式。例如

1
2
3
4
5
6
7
8
9
10
11
public class example {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
Iterator iterator = (Iterator) list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}

这里的ArrayList类中实现类Iterator接口的内部类,并且使用iterator()方法调用new Itr();,具体内容可以查看ArrayList源码。

下面自己实现一个简单的Iterator.

第一部分:抽象迭代器

1
2
3
4
public interface Iterator<E> {
boolean hasNext();
E next();
}

第二部分:抽象容器类

1
2
3
4
5
public interface Task {
void add(int mark);
void removeLast();
Iterator<Object> iterator();
}

第三部分:实现类

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
32
33
34
35
36
37
38
39
40
41
42
public class MyTask implements Task {

private int size = 0 ;

private Object[] taskTag = new Object[16];

@Override
public void add(int mark) {
taskTag[size] = mark;
size ++;
}

@Override
public void removeLast() {
taskTag[--size] = null;
}

@Override
public Iterator<Object> iterator() {
// 调用内部类实现迭代器
return new MyTaskItr();
}
// 使用内部类实现迭代器
private class MyTaskItr implements Iterator<Object>{

private int curr;

@Override
public boolean hasNext() {
return size != curr;
}

@Override
public Object next() {
int i = curr;
if(i >= size){
throw new NoSuchElementException("no element");
}
return taskTag[curr++];
}
}
}

客户端调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class App {
public static void main(String[] args) {
Task task = new MyTask();
task.add(1);
task.add(3);
task.add(4);
task.add(2);
task.removeLast();
task.removeLast();
task.add(5);
Iterator taskIterator = task.iterator();
while(taskIterator.hasNext()){
System.out.println(taskIterator.next());
}
// 结果依次打印出 1,3,5
}
}

简单而强大的迭代器模式。

-------------本文结束感谢您的阅读-------------

本文标题:设计模式之迭代器模式

文章作者:NanYin

发布时间:2019年06月27日 - 12:06

最后更新:2019年08月12日 - 13:08

原始链接:https://nanyiniu.github.io/2019/06/27/2019-06-27-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E4%B9%8B%E8%BF%AD%E4%BB%A3%E5%99%A8%E6%A8%A1%E5%BC%8F/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。