概述
迭代器的关键点在于把对聚合对象的遍历和访问的功能从聚合对象中分离出来,可以在访问一个聚合对象的内容的时候,无须暴露出该聚合对象的内部表示,从而提高聚合对象的封装性,这样不但简化了聚合对象,并且可以让迭代器和聚合对象可以独立变化和发展,从而大大加强系统的灵活性。
在普通的迭代器的实现中还可以添加遍历策略,以及实现双向迭代。
迭代器可以用在如下场景:
不想暴露所要访问的聚合对象的内容。
希望为遍历不同的对象提供一个统一的接口。
迭代器模式把聚合对象和访问聚合的机制实现了分离,通过这种模式可以在迭代器上实现不同的迭代策略。
public interface Iterator { public void first(); public void next(); public boolean hasnext(); public Object CurrentItem(); }
|
public class ConcreIterator implements Iterator { private Aggresive agressive = null; private int index = -1; public ConcreIterator(Aggresive agressive) { this.agressive = agressive; } @Override public void first() { index = 0; } @Override public void next() { index++; } @Override public boolean hasnext() { if(index < this.agressive.size()) { return true; } return false; } @Override public Object CurrentItem() { return this.agressive.getItem(index); } }
|
public interface Aggresive { public int size(); public Object getItem(int index); public Iterator createIterator(); }
|
public class ConcreAggressiveArray implements Aggresive { private int array[]; public ConcreAggressiveArray(int array[]) { this.array = array; } @Override public int size() { return this.array.length; } @Override public Object getItem(int index) { return this.array[index]; } @Override public Iterator createIterator() { return new ConcreIterator(this); } }
|
import java.util.ArrayList; public class ConcreAggressiveList implements Aggresive { private ArrayList<Integer> list; public ConcreAggressiveList(ArrayList<Integer> list) { this.list = list; } @Override public int size() { return this.list.size(); } @Override public Object getItem(int index) { return this.list.get(index); } @Override public Iterator createIterator() { return new ConcreIterator(this); } }
|
import java.util.ArrayList; public class Client { public static void main(String args[]) { int testArray[] = {1,2,3,4,5,5,6,7,7,8,8,9}; ConcreAggressiveArray aggressive = new ConcreAggressiveArray(testArray); Iterator iterator = aggressive.createIterator(); iterator.first(); while(iterator.hasnext()) { Object obj = iterator.CurrentItem(); System.out.println("obj = "+obj.toString()); iterator.next(); } System.out.println("===================================================="); ArrayList<Integer> lists = new ArrayList<>(); lists.add(1); lists.add(12); lists.add(13); lists.add(14); lists.add(15); lists.add(16); lists.add(17); ConcreAggressiveList list = new ConcreAggressiveList(lists); Iterator iterators = list.createIterator(); iterators.first(); while(iterators.hasnext()) { Object obj = iterators.CurrentItem(); System.out.println("obj = "+obj.toString()); iterators.next(); } } }
|