1.定义
一种遍历访问聚合对象内各元素的一种方法,不暴露该对象的内部结构。
2.使用场景
1、访问一个聚合对象的内容而无须暴露它的内部表示。 2、需要为聚合对象提供多种遍历方式。 3、为遍历不同的聚合结构提供一个统一的接口。
例如:JAVA 中的 iterator。
3.实现
/**
* 抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、next() 等方法。
* @author Administrator
*
*/
public interface Iterator {
boolean hasNext();
Object next();
}
/**
* 抽象聚合(Container)角色:定义存储、添加、删除聚合元素以及创建迭代器对象的接口。
* @author Administrator
*
* @param <T>
*/
public interface Container<T> {
void add(T data);
void remove(T data);
Iterator getIterator();
}
/**
* 具体聚合(ConcreteContainer)角色:实现抽象聚合接口中方法,返回一个具体迭代器的实例。
* @author Administrator
*
* @param <T>
*/
public class ConcreteContainer<T> implements Container<T>{
private List<T> list = new ArrayList<>();
@Override
public void add(T data) {
// TODO Auto-generated method stub
list.add(data);
}
@Override
public void remove(T data) {
// TODO Auto-generated method stub
list.remove(data);
}
@Override
public Iterator getIterator() {
// TODO Auto-generated method stub
return new ConcreteIterator();
}
/**
* 具体迭代器(ConcreteIterator)角色:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。
*
*/
private class ConcreteIterator implements Iterator{
int index;
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
if(index<list.size()) {
return true;
}
return false;
}
@Override
public Object next() {
// TODO Auto-generated method stub
if(this.hasNext()) {
return list.get(index++);
}
return null;
}
}
}
/**
* 测试类
* @author Administrator
*
*/
public class Test {
public static void main(String[] args) {
Container<String> strs = new ConcreteContainer<>();
strs.add("123");
strs.add("456");
strs.add("789");
for(Iterator it=strs.getIterator();it.hasNext();) {
System.out.println(it.next());
}
}
}
运行结果
4.总结
主要解决:不同的方式来遍历整个整合对象。
优点: 1、它支持以不同的方式遍历一个聚合对象。 2、迭代器简化了聚合类。 3、在同一个聚合上可以有多个遍历。 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
缺点: 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。