迭代器模式(Iterator)提供一种方法顺序访问一个聚合对象中的各类元素,而又不暴露对象的内部表示。java
类型:形为型模式 git
顺口溜:中访策备迭 观模命状职解github
package com.amosli.dp.behavior.iterator; public abstract class Aggregate { public abstract Iterator ConcreteIterator(); } package com.amosli.dp.behavior.iterator; public abstract class Iterator { public abstract Object first(); public abstract Object last(); public abstract Object next(); public abstract Boolean isDone(); public abstract Object currentItem(); } package com.amosli.dp.behavior.iterator; import java.util.ArrayList; import java.util.List; public class ConcreteAggregate extends Aggregate { private List<Object> items = new ArrayList<Object>(); @Override public Iterator ConcreteIterator() { return new ConcreteIterator(this); } public Object get(int index) { return items.get(index); } public int size() { return items.size(); } public void add(Object obj) { items.add(obj); } } package com.amosli.dp.behavior.iterator; public class ConcreteIterator extends Iterator { private ConcreteAggregate concreteAggregate; public ConcreteIterator(ConcreteAggregate concreteAggregate) { this.concreteAggregate = concreteAggregate; } private int count=0; @Override public Object first() { return concreteAggregate.get(0); } @Override public Object last() { return concreteAggregate.get(concreteAggregate.size() - 1); } @Override public Object next() { return concreteAggregate.get(count++); } @Override public Object currentItem() { return concreteAggregate.get(count); } @Override public Boolean isDone() { return count >= concreteAggregate.size(); } } package com.amosli.dp.behavior.iterator; public class Client { public static void main(String[] args) { ConcreteAggregate aggregate = new ConcreteAggregate(); for (int i = 0; i < 10; i++) { aggregate.add("i" + i); } ConcreteIterator iterator = new ConcreteIterator(aggregate); System.out.println(aggregate.size()); System.out.println("first:" + iterator.first()); System.out.println("last:" + iterator.last()); System.out.println("current:" + iterator.last()); while (!iterator.isDone()) { System.out.println(iterator.next()); } System.out.println("over"); } }
当你须要访问一个聚合对象,并且无论这些对象是什么都须要遍历的时候,就应该考虑使用迭代器模式。算法
另外,当须要对汇集有多种方式遍历时,能够考虑去使用迭代器模式。数组
简化了遍历方式,对于对象集合的遍历,仍是比较麻烦的,对于数组或者有序列表,咱们尚能够经过游标来取得,但用户须要在对集合了解很清楚的前提下,自行遍历对象,可是对于hash表来讲,用户遍历起来就比较麻烦了。而引入了迭代器方法后,用户用起来就简单的多了。ide
能够提供多种遍历方式,好比说对有序列表,咱们能够根据须要提供正序遍历,倒序遍历两种迭代器,用户用起来只须要获得咱们实现好的迭代器,就能够方便的对集合进行遍历了。this
封装性良好,用户只须要获得迭代器就能够遍历,而对于遍历算法则不用去关心。spa
对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐,你们可能都有感受,像ArrayList,咱们宁肯愿意使用for循环和get方法来遍历集合。code
本系列文章源码地址,https://github.com/amosli/dp 欢迎Fork & Star !!orm