聚合
指一组对象的组合结构,如Java中的集合、数组等
迭代器模式
提供一种方法,顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示
目标
以一个统一的方式来访问内部实现不同的聚合对象
示例代码
- 迭代器接口
/**
* 迭代器接口,定义访问和遍历元素的操作
*
*/
public interface Iterator {
/**
* 移动到聚合对象的第一个位置
*/
public void first();
/**
* 移动到聚合对象的下一个位置
*/
public void next();
/**
* 判断是否已经移动到聚合对象的最后一个位置
* @return true表示已经移动到聚合对象的最后一个位置
* false 表示还没有移动到聚合对象的最后一个位置
*/
public boolean isDone();
/**
* 获取迭代的当前元素
* @return 迭代的当前元素
*/
public Object currentItem();
}
- 聚合对象的接口
/**
* 聚合对象的接口,定义创建相应迭代器对象接口
*
*/
public abstract class Aggregate {
/**
* 工厂方法,创建相应迭代器对象的接口
* @return 相应迭代器对象的接口
*/
public abstract Iterator createIterator();
}
- 迭代器实现对象
/**
* 具体的迭代器实现对象,示意的是聚合对象为数组的迭代器
* 不同的聚合对象,相应的迭代器实现是不一样的
*/
public class ConcreteIterator implements Iterator{
/**
* 持有被迭代的具体的聚合对象
*/
private ConcreteAggregate aggregate;
/**
* 内部索引,记录当前被迭代到的索引位置
* -1 表示刚开始的时候,迭代器指向聚合对象第一个元素之前
*/
private int index = -1;
/**
* 构造方法,传入被迭代的具体的聚合对象
* @param aggregate 被迭代的具体的聚合对象
*/
public ConcreteIterator(ConcreteAggregate aggregate) {
this.aggregate = aggregate;
}
@Override
public void first() {
index = 0;
}
@Override
public void next() {
if(index < this.aggregate.size()) {
index = index + 1;
}
}
@Override
public boolean isDone() {
if(index == this.aggregate.size()) {
return true;
}
return false;
}
@Override
public Object currentItem() {
return this.aggregate.get(index);
}
}
- 具体的聚合对象
/**
* 具体的聚合对象,实现创建相应迭代器对象的功能
*
*/
public class ConcreteAggregate extends Aggregate{
/**
* 聚合对象的具体内容
*/
private String[] array = null;
/**
* 构造方法,传入聚合对象具体的内容
* @param array 聚合对象具体的内容
*/
public ConcreteAggregate(String[] array) {
this.array = array;
}
@Override
public Iterator createIterator() {
return new ConcreteIterator(this);
}
/**
* 获取索引相对应的元素
* @param index 索引
* @return 索引相对应的元素
*/
public Object get(int index) {
Object ret = null;
if(index<array.length) {
ret = array[index];
}
return ret;
}
/**
* 获取聚合对象的大小
* @return 聚合对象的大小
*/
public int size() {
return this.array.length;
}
}
- 使用示例
String[] names = {"张三","李四","王五","赵六"};
//创建聚合对象
Aggregate aggregate = new ConcreteAggregate(names);
//循环输出聚合对象中的值
Iterator it = aggregate.createIterator();
//首先设置迭代器到第一个元素
it.first();
while(!it.isDone()) {
Object obj = it.currentItem();
System.out.println(obj);
it.next();
}