概述
迭代器模式又称为游标(CUrsor)模式,是行为型设计模式之一.
迭代器模式在容器类的设计中用到十分的广泛,主要为了解决 容器类中,提供遍历接口 和 对外隐藏细节的平衡,遍历方法会导致容器类承担过多的功能,而不提供遍历方法则无疑需要对外暴露诸多内部实现细节.
定义
提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示
使用场景
- 遍历一个容器对象时.
UML类图
类图中涉及到的角色有:
Iterator
:迭代器接口.负责定义,访问,和遍历元素的接口.Concrete Iterator
: 具体的迭代器类,实现了迭代器接口,并记录遍历的当前位置.Aggregate
: 容器接口,负责提供创建具体迭代器角色的接口Concrete Aggregate
: 具体的容器类,具体迭代器角色与该容器相关联Client
: 客户类
实例
如下是简单的迭代器实现,
- 首先定义迭代器接口
public interface Iterator<T> {
/**
* 是否还有下一个元素
*/
boolean hasNext();
/**
* 返回当前位置的元素并将位置移至下一步
*/
T next();
}
- 具体迭代器类
public class ConcreteIterator<T> implements Iterator<T> {
private List<T> mList = new ArrayList<>();
private int cursor = 0;
public ConcreteIterator(List<T> _list) {
mList = _list;
}
@Override public boolean hasNext() {
return cursor != mList.size();
}
@Override public T next() {
T obj = null;
if (this.hasNext()) {
obj = this.mList.get(cursor++);
}
return obj;
}
}
- 容器接口
public interface Aggregate<T> {
/**
* 添加一个元素
* @param _t
*/
void add(T _t);
/**
* 移除一个元素
* @param _t
*/
void remove(T _t);
/**
* 获取容器的迭代器
* @return
*/
Iterator<T> iterator();
}
- 容器
public class ConcreteAggregate<T> implements Aggregate<T> {
private List<T> mList = new ArrayList<>();
@Override public void add(T _t) {
mList.add(_t);
}
@Override public void remove(T _t) {
mList.remove(_t);
}
@Override public Iterator<T> iterator() {
return new ConcreteIterator<T>(mList);
}
}
- 客户端调用
Aggregate<String> aggregate = new ConcreteAggregate<>();
aggregate.add("Aige");
//...
Iterator<String> iterator = aggregate.iterator();
while (iterator.hasNext()) {
Toast.makeText(IteratorActivity.this, "it next-->" + iterator.next(), Toast.LENGTH_SHORT)
.show();
}
优缺点
- 迭代器模式支持以不同的方式去遍历一个容器对象,也可以有多个遍历.弱化了容器类与遍历算法之间的关系.
- 缺点同样是类文件的增多,消耗一定的内存.
- 迭代器模式中的遍历是单向的且不可逆.
- 需要注意迭代时修改的
ConcurrentModificationException
参考:
《JAVA与模式》之迭代子模式