设计模式 迭代器模式

本文将介绍设计模式中的迭代器模式。

一、什么是迭代器模式?

迭代器模式又被称为游标模式,通过引入迭代器,将数据的遍历功能从聚合对象中分离出来,聚合对象只负责存储数据,迭代器负责遍历数据,简化了聚合对象的设计,更符合单一职责原则的要求。

二、实现

1. 结构

2. 角色

  • Iterator 抽象迭代器:
    • 声明了访问和遍历元素的方法
  • ConcreteIterator 具体迭代器:
    • 实现了访问和遍历元素的方法
  • Aggregate 抽象聚合类:
    • 声明了一个 createUterator() 方法,用于创建一个迭代器对象
  • ConcreteAggregate 具体聚合类

3. 简单示例

Iterator:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public interface Iterator {
/**
* 将游标指向第一个元素
*/
void first();

/**
* 将游标指向下一个元素
*/
void next();

/**
* 判断是否存在下一个元素
*/
boolean hasNext();

/**
* 获取游标指向的元素
*/
Object currentItem();
}

ConcreteIterator:

1
2
3
4
5
6
7
8
9
public class ConcreteIterator implements Iterator {
// 对聚合对象的引用
private Aggregate aggregate;

// 游标
private int cursor;

// ···
}

Aggregate:

1
2
3
public interface Aggregate {
Iterator createIterator();
}

ConcreteAggregate:

1
2
3
4
5
public class ConcreteAggregate implements Aggregate {
public Iterator createIterator() {
return new ConcreteIterator(this);
}
}

三、实例内部类实现迭代器

关于实例内部类,具体请看:

Java 面向对象 - 实例内部类

在传统的迭代器实现中,为了能够在迭代器中访问聚合对象,还需要在迭代器中维护聚合对象的引用。

实例内部类属于外部类实例,可以直接访问外部类的实例属性及方法,因此可以通过实例内部类实现迭代器。

1
2
3
4
5
6
7
8
9
10
11
12
public class ConcreteAggregate implements Aggregate {
public Iterator createIterator() {
return new ConcreteIterator();
}

private class ConcreteIterator implements Iterator {
// 游标
private int cursor;

// ···
}
}

四、Java 内置迭代器

具体请看:

Java 集合 - 迭代器

五、优缺点

1. 优点

  • 迭代器简化了聚合类的实现
  • 由于引入抽象层,增加新的聚合类和迭代器类都更方便,无需修改原有代码

2. 缺点

  • 类的数量会增加,导致系统复杂性增加

参考

  • 《Java 设计模式》