在面向对象的软件设计中,我们经常会遇到一类集合对象,这类集合对象的内部结构可能有着各种各样的实现,但是归结起来,无非有两点是需要我们去关心的:一是集合内部的数据存储结构,二是遍历集合内部的数据。面向对象设计原则中有一条是类的单一职责原则,所以我们要尽可能的去分解这些职责,用不同的类去承担不同的职责。Iterator模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据。
提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
一,结构:
二,示例代码:
/** * 抽象聚集 * @author Salmon * */ public interface List { public Iterator getIterator(); } /** * 抽象迭代器 * @author Salmon * */ public interface Iterator { public boolean moveNext(); public Object currentItem(); public void first(); public void next(); } /** * 具体聚集 * @author Salmon * */ public class ConcreteList implements List { int[] list; public ConcreteList() { list = new int[] { 1, 2, 3, 4, 5 }; } public Iterator getIterator() { return new ConcreteIterator(this); } public int getLength() { return list.length; } public int getElement(int index) { return list[index]; } } /** * 具体迭代器 * @author Salmon * */ public class ConcreteIterator implements Iterator { private ConcreteList list; private int index; public ConcreteIterator(ConcreteList list) { this.list = list; index = 0; } public boolean moveNext() { if (index < list.getLength()) return true; else return false; } public Object currentItem() { return list.getElement(index); } public void first() { index = 0; } public void next() { if (index < list.getLength()) { index++; } } } /** * 客户端程序 * @author Salmon * */ public class Program { public static void main(String[] args) { Iterator iterator; List list = new ConcreteList(); iterator = list.getIterator(); while (iterator.moveNext()) { Object o = iterator.currentItem(); System.out.println(o.toString()); iterator.next(); } } }