迭代器模式介绍
迭代器模式又称为游标模式,是行为设计模式之一。迭代器模式算是一个比较古老的设计模式,其源于对容器的访问,比如java中的List、Map、数组等,我们知道对容器对象的访问必然会涉及算法,我们可以将遍历的方法封装在容器中,或者不提供遍历方法。如果我们将遍历的方法封装到容器中,那么对应容器类来说就承担了太多的功能,容器类不仅要维护自身内部的数据元素而且还要对外提供遍历的接口方法,因为遍历状态的存储问题还不能对同一个容器同时进行多个遍历操作,如果我们不提供**遍历方法而让使用者自己实现,又会让容器的内部细节暴露无遗,正因于此,迭代模式应运而生,在客户访问类与容器体之间插入一个第三者-迭代器,很好的解决了上面所述问题。
迭代器模式的定义
提供一种方法顺序访问一个容器对象中的各个元素,而不需要暴露该对象的内部表示。
迭代器模式的使用场景
遍历一个容器对象时
迭代器模式的UML类图
代码实现
//迭代器接口
interface Iterator {
public Object next();
public boolean hasNext();
}
//容器数据操作
public interface Aggregate {
public void add(Object obj);
public void remove(Object obj);
public Iterator iterator();
}
//迭代器具体实现类
public class ConcreteIterator implements Iterator {
private List List = new ArrayList();
private int cursor = 0;
public ConcreteIterator(List list) {
this.List = list;
}
@Override
public Object next() {
Object object = null;
if (this.hasNext()) {
object = this.List.get(cursor++);
}
return object;
}
@Override
public boolean hasNext() {
if (cursor == List.size()) {
return false;
}
return true;
}
}
//容器的具体实现类
public class ConcreteAggregate implements Aggregate {
private List list = new ArrayList();
public void add(Object obj) {
list.add(obj);
}
public void remove(Object obj) {
list.remove(obj);
}
@Override
public Iterator iterator() {
return new ConcreteIterator(list);
}
}
//客户端
public class Client {
public static void main(String[] args) {
Aggregate ag = new ConcreteAggregate();
ag.add("小子");
ag.add("小红");
ag.add("小李");
Iterator iterator = ag.iterator();
while (iterator.hasNext()) {
String str = (String) iterator.next();
System.out.println(str);
}
}
}
Iterator:迭代器接口
迭代器接口负责定义、访问和遍历元素的接口
ConcreteIterator:具体迭代器类
Aggregate:容器接口
容器接口负责提供创建具体迭代器角色的接口
ConcreteAggregate:具体容器类
具体迭代器角色与该容器相关连
Client:客户类
总结
迭代模式其自身优点明显也很单一,支持以不同的方式去遍历一个容器对象,也可以有多个遍历,弱化了容器类与遍历算法之间的关系,而其缺点就是对类文件的增加。现在其他很多语言如c++,Python,PHP等,他们内部有众多容器的定义,当然也有相应的迭代器。高级语言都内置了迭代器实现,因此,对应迭代器更多的是在我们了解而非应用。