迭代器模式的定义
*迭代器(Iterator)模式: * 提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示,迭代器模式是一种对象行为型模式
- Java Collection都使用了迭代器
特点
1. 优点
- 访问一个聚合对象的内容而无需暴露它的内部表示
- 遍历任务交由迭代器完成,这简化了聚合类
- 它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历
- 增加新的聚合类和迭代器类都很方便,无序修改原有代码
- 封装性良好,为遍历不同的聚合结构提供一个统一的接口
2. 缺点
- 增加了类的个数,一定程度上增加了系统的复杂性
模式的结构与实现
1. 模式的结构
抽象聚合(Aggregate)角色: 定义存储、添加、删除聚合对象以及创建迭代器对象的接口
具体聚合(ConcreteAggregate)角色: 实现抽象聚合类,返回一个具体迭代器的实例
抽象迭代器(Iterator)角色: 定义访问和遍历聚合元素的接口,通常包含 hasNext()、first()、next() 等方法
具体迭代器(Concretelterator)角色: 实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置
2. 模式的实现
/**
* 迭代器模式
* java中已经有迭代器相关接口Iterator与Iterable
* 推荐Iterable(可以返回Iterator,Spliterator,支持forEach)
*/
//抽象聚合
interface Aggregate<T>{
void add(T t);
void remove(T t);
Iterator<T> getIterator();
Iterable<T> getAll();
}
//具体聚合
class ConcreteAggregate<T> implements Aggregate<T>{
private List<T> list = new ArrayList<>();
@Override
public void add(T t) {
list.add(t);
}
@Override
public void remove(T t) {
list.remove(t);
}
@Override
public Iterable<T> getAll() {
return Collections.unmodifiableList(list); //返回不可修改的list
}
//返回迭代器对象
@Override
public Iterator<T> getIterator() {
return new ConcreteIterator<>();
}
//具体自定义迭代器:实现Iterator接口
class ConcreteIterator<T> implements Iterator<T>{
private int index = -1;
@Override
public boolean hasNext() {
if(index < list.size()-1) return true;
else return false;
}
@Override
public T next() {
T t = null;
if(hasNext()) t = (T)list.get(++index);
return t;
}
}
}
//测试
public class IteratorPattern {
public static void main(String[] args) {
Aggregate<Integer> ag=new ConcreteAggregate<>();
ag.add(1);
ag.add(2);
ag.add(3);
System.out.print("Iterator:");
Iterator<Integer> it=ag.getIterator();
while(it.hasNext()) {
Object ob=it.next();
System.out.print(ob.toString());
}
System.out.print("\tIterable:");
ag.getAll().forEach(System.out::print);
}
}