迭代器模式:提供一种方法顺序来访问一个聚合对象中的元素,并且不暴露该对象的内部表示。当我们需要去遍历一个对象时就可以考虑使用迭代器模式。
聚集抽象类
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接口类似。