迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而不是暴露该对象的内部表示。
在软件开发过程中,因为业务的需要,我们会创建不同的集合或者数组,每次遍历取值都要重复相同的代码。在设计模式中能够将遍历进行封装,而不会暴露内部的表示,还能够提供多种不同的遍历方式。这就是迭代器模式,其UML图如下:
迭代器模式由以下组成部分:
抽象迭代器(Iterator):所有迭代器都需要实现的接口,提供了遍历元素所需要的方法。
hasNext():判断遍历是否结束
remove():移除当前对象
next():取得下一个元素
具体迭代器(ConcreteIterator): 利用这个具体的迭代器能够对具体的聚合对象进行遍历。每一个聚合对象都应该对应一个具体的迭代器。
抽象聚合类 (Aggregate):一般是一个接口,提供creatorIterator()方法。
具体聚合类 (ConcreteAggregate): 实现creatorIterator()方法,返回该聚合对象的迭代器。
代码部分:
抽象迭代器
interface Iterator {
public Object next();
public boolean hasNext();
}
具体迭代器:
class ConcreteIterator implements Iterator {
private List list = new ArrayList();
private int index;
public ConcreteIterator(List list) {
this.list = list;
}
@Override
public Object next() {
Object obj = null;
if(this.hasNext()){
obj = this.list.get(index++);
}
return obj;
}
@Override
public boolean hasNext() {
if (index > list.size()) {
return false;
} else {
return true;
}
}
}
聚集抽象类:
interface Aggregate {
public void add(Object o);
public void remove(Object o);
public Iterator createIterator();
}
具体聚集类:
class ConcreteAggregate implements Aggregate {
private List list = new ArrayList();
@Override
public void add(Object o) {
list.add(o);
}
@Override
public void remove(Object o) {
list.remove(o);
}
@Override
public Iterator createIterator() {
return new ConcreteIterator(list);
}
}
客户端调用:
public static void main(String[] args) {
Aggregate ag = new ConcreteAggregate();
ag.add("1");
ag.add("2");
ag.add("3");
ag.add("4");
Iterator it = ag.createIterator();
while(it.hasNext()){
String str= (String)it.next();
System.out.println(str);
}
}
输出结果:
代码地址:Iterator
二、模式结语
迭代器模式简化了遍历方式,对于对象集合的遍历,还是比较麻烦的,对于数组或者有序列表,我们尚可以通过游标来取得,但用户需要在对集合了解很清楚的前提下,自行遍历对象,但是对于hash表来说,用户遍历起来就比较麻烦了。而引入了迭代器方法后,用户用起来就简单的多了。
可以提供多种遍历方式,比如说对有序列表,我们可以根据需要提供正序遍历,倒序遍历两种迭代器,用户用起来只需要得到我们实现好的迭代器,就可以方便的对集合进行遍历了。
封装性良好,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心。
欢迎大家评论留言,点击查看更多设计模式。