一、迭代器模式介绍
迭代器模式(Iterator Pattern)是
Java
和.Net
编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示,它属于行为型模式。迭代器模式角色:
Iterator
(迭代器):迭代器定义访问和遍历元素的接口。ConcreteIterator
(具体迭代器):具体迭代器实现迭代器接口,对该聚合遍历时跟踪当前位置。Aggregate
(聚合):聚合定义创建相应迭代器对象的接口。ConcreteAggregate
(具体聚合):具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator
的一个适当的实例。此处我们有一个诉求:
- 使用迭代器模式,进行数组遍历。
二、迭代器模式使用
2.1 示例关系:
2.2 代码实现:
/* *
* 1. 迭代器接口接口(Iterator)。
*/
interface Iterator {
/* *
* 判断集合是否还有元素可以遍历。
*/
boolean hasNext();
/* *
* 返回迭代的下一个元素。
*/
Object next();
}
/* *
* 2. 容器接口(Aggregate)。
*/
interface Container {
/* *
* 创建迭代器。
*/
Iterator createIterator();
}
/* *
* 3. 数组容器(ConcreteAggregate)实现容器接口。
*/
class ArrayContainer implements Container {
/* *
* 通过传入数组进行构造。
*/
Object[] arrays;
public ArrayContainer(Object[] arrays) {
this.arrays = arrays;
}
@Override
public Iterator createIterator() {
return new ArrayIterator();
}
/* *
* 遍历并打印元素方法。
*/
public void printArrayElements(Iterator iterator) {
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
}
/* *
* 4. 数组迭代器(ConcreteIterator)实现Iterator接口。
* 此处使用到了私有内部类的方式。
*/
private class ArrayIterator implements Iterator {
int index = 0;
@Override
public boolean hasNext() {
return index < arrays.length;
}
@Override
public Object next() {
if (this.hasNext()) {
return arrays[index++];
}
return null;
}
}
}
/* *
* 5. 客户端调用。
*/
public class Client {
public static void main(String[] args) {
// 创建一个数组。
Object[] arrays = new Object[]{0, 1, 2, 3, 4, "str"};
// 通过具体的聚合对象,来创建对应的具体迭代器。
ArrayContainer arrayContainer = new ArrayContainer(arrays);
Iterator iterator = arrayContainer.createIterator();
// 遍历元素。
arrayContainer.printArrayElements(iterator);
// 0 1 2 3 4 str
}
}
三、迭代器模式总结
优点:
- 客户端只需要使用迭代器,不用关心内部结构。
- 提供了统一的方法遍历。
- 将管理对象集合和遍历对象集合的责任分开,若集合变更则只影响到聚合对象,若遍历方式变更,则只影响到迭代器。
- 当需要展示一组相似或者相同对象时,适合使用迭代器模式。
缺点:
- 每个聚合对象都需要一个迭代器,会生成多个迭代器不方便管理类。
应用场景:
JDK
中ArrayList
集合应用到了该模式。
四、结束语
“-------怕什么真理无穷,进一寸有一寸的欢喜。”
微信公众号搜索:饺子泡牛奶。