在面向对象的软件设计中,我们经常会遇到一类集合对象,这类集合对象的内部结构可能有着各种各样的实现,但是归结起来,无非有两点是需要我们去关心的:一是集合内部的数据存储结构,二是遍历集合内部的数据。面向对象设计原则中有一条是类的单一职责原则,所以我们要尽可能的去分解这些职责,用不同的类去承担不同的职责。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();
}
}
}