说明
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
UML
角色:
1.Iterator(迭代器)
迭代器定义访问和遍历元素的接口
2.ConcreteIterator (具体迭代器)
具体迭代器实现迭代器接口,对该聚合遍历时跟踪当前位置
3.Aggregate (聚合)
聚合定义创建相应迭代器对象的接口
4.ConcreteAggregate (具体聚合)
具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例
代码
自定义一个字符串集合的迭代器,代码如下。
迭代器角色,定义访问和遍历元素的接口
/**
* @author ctl
* @date 2021/1/26
*/
public interface Iterator {
// 获取前一个
public Object prev();
// 获取后一个
public Object next();
// 是否还可以继续迭代
public boolean hasNext();
// 指针置为起始位置并返回对应值
public Object first();
}
具体迭代器角色,实现迭代器接口,对该聚合遍历时跟踪当前位置
/**
* @author ctl
* @date 2021/1/26
*/
public class ConcreteIterator implements Iterator {
private Collection collection;
private int pos = -1;
public ConcreteIterator(Collection collection) {
this.collection = collection;
}
@Override
public Object prev() {
if (pos > 0) {
pos--;
}
return collection.get(pos);
}
@Override
public Object next() {
if (pos < collection.size() - 1) {
pos++;
}
return collection.get(pos);
}
@Override
public boolean hasNext() {
return pos < collection.size() - 1;
}
@Override
public Object first() {
pos = 0;
return collection.get(pos);
}
}
聚合角色,定义创建相应迭代器对象的接口
/**
* @author ctl
* @date 2021/1/26
*/
public interface Collection {
public Iterator iterator();
public Object get(int i);
public int size();
}
具体聚合角色,实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例
/**
* @author ctl
* @date 2021/1/26
*/
public class ConcreteCollection implements Collection {
private String[] strs;
public ConcreteCollection(String[] strs) {
this.strs = strs;
}
@Override
public Iterator iterator() {
return new ConcreteIterator(this);
}
@Override
public Object get(int i) {
return strs[i];
}
@Override
public int size() {
return strs.length;
}
}
测试类
/**
* @author ctl
* @date 2021/1/26
*/
public class IteratorMain {
public static void main(String[] args) {
String[] strs = {"a", "b", "c", "d", "e"};
Collection collection = new ConcreteCollection(strs);
Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
System.out.println(next);
}
}
}
结果
完成了对字符串的迭代。
总结
其实我们对迭代器并不陌生,jdk中的很多集合类都实现了迭代器模式,我们可以根据迭代器模式的思想实现个性化的迭代器,从而达到使用不同的方式来对集合进行遍历。
比如本例中实现了一个first方法,可以在任意过程中将指针指向首位然后再继续迭代,当然也可以实现将指针指向随意一个有效位置进行迭代,或者实现反向迭代等等。