迭代器模式:提供一种方法顺序来访问一个聚合对象中的元素,并且不暴露该对象的内部表示。当我们需要去遍历一个对象时就可以考虑使用迭代器模式。
聚集抽象类
public interface Collection {
Iterator createIterator();
}
具体聚集类。
public class ConcreteCollection implements Collection {
private List<Object> list = new ArrayList<>();
@Override
public Iterator createIterator() {
return new ConcreteIterator(this);
}
//获取集合大小
public int count(){
return list.size();
}
//添加元素
public void setList(Object object){
list.add(object);
}
//获取元素
public Object getList(int index){
return list.get(index);
}
}
迭代抽象类。
public interface Iterator {
//第一个节点
Object first();
//下一个节点
Object next();
//是否遍历完成
Boolean isDone();
//当前节点
Object currentItem();
}
具体迭代类。
public class ConcreteIterator implements Iterator {
private ConcreteCollection concreteCollection;
private int current = 0;
public ConcreteIterator(ConcreteCollection concreteCollection){
this.concreteCollection = concreteCollection;
}
@Override
public Object first() {
return concreteCollection.getList(0);
}
@Override
public Object next() {
current++;
if(current<concreteCollection.count()){
return concreteCollection.getList(current);
}else {
return null;
}
}
@Override
public Boolean isDone() {
return current >=concreteCollection.count()? true:false;
}
@Override
public Object currentItem() {
return concreteCollection.getList(current);
}
}
测试类。
public class Test {
public static void main(String[] args) {
ConcreteCollection concreteCollection = new ConcreteCollection();
concreteCollection.setList("a");
concreteCollection.setList("b");
concreteCollection.setList("c");
concreteCollection.setList("d");
ConcreteIterator concreteIterator = new ConcreteIterator(concreteCollection);
Object first = concreteIterator.first();
while (!concreteIterator.isDone()){
System.out.println(concreteIterator.currentItem());
concreteIterator.next();
}
}
}
测试结果:
a
b
c
d
其实迭代器模式在java中早有实现,java中的集合类实现了Iterable接口,而Iterable接口中声明了一个Iterator方法,返回一个Iterator,这个Iterator接口中定义了遍历的相关方法,和上面的例子中的Iterator接口类似。
来源:https://www.cnblogs.com/yimengyizhen/p/11163892.html