定义
迭代器模式(Iterator Pattern) 提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。迭代器模式是一种对象行为型模式。
模式结构
角色职责
1.抽象聚合(Aggregate)角色: 定义存储、添加、删除聚合对象以及创建迭代器对象的接口。
2.具体聚合(ConcreteAggregate)角色: 实现抽象聚合类,返回一个具体迭代器的实例。
3.抽象迭代器(Iterator)角色: 定义访问和遍历聚合元素的接口,通常包含 hasNext()、first()、next() 等方法。
4.具体迭代器(Concretelterator)角色: 实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。
代码实现
抽象聚合角色:
public interface Aggregate {
void add(Object obj);
void remove(Object obj);
Iterator iterator();
}
具体聚合角色:
public class ConcreteAggregate implements Aggregate {
LinkedList<Object> list = new LinkedList<>();
@Override
public void add(Object obj) {
list.add(obj);
}
@Override
public void remove(Object obj) {
this.remove(obj);
}
@Override
public Iterator iterator() {
return new ConcreteIterator(list);
}
}
抽象迭代:
public interface Iterator {
Object next();
boolean hasNext();
boolean remove();
}
具体迭代:
public class ConcreteIterator implements Iterator {
private LinkedList<Object> list;
private int index = 0;
public ConcreteIterator(LinkedList<Object> list){
this.list = list;
index = 0;
}
@Override
public Object next() {
if(this.hasNext())
return list.get(index++);
else
return null;
}
@Override
public boolean hasNext() {
return index < list.size() && list != null;
}
@Override
public boolean remove() {
list.remove(index);
return true;
}
}
测试:
public class Client {
public static void main(String[] args) {
Aggregate agg = new ConcreteAggregate();
agg.add(111);
agg.add(222);
agg.add(333);
Iterator iterator = agg.iterator();
while(iterator.hasNext())
System.out.println(iterator.next());
}
}
适用场景
1、当需要为聚合对象提供多种遍历方式时。
2、当需要为遍历不同的聚合结构提供一个统一的接口时。
3、当访问一个聚合对象的内容而无须暴露其内部细节的表示时。
优缺点
优点:
易用性:客户不用再考虑聚合的类型,使用一种方法就可以遍历对象了。
低耦合:隐藏了聚合的内部结构,客户端要遍历聚合的时候只能取到迭代器,而不会知道聚合的具体组成。
提供了一种设计思想,就是一个类应该只有一个引起变化的原因(叫做单一责任原则)。在聚合类中,我们把迭代器分开,就是要把管理对象集合和遍历对象集合的责任分开,这样一来集合改变的话,只影响到聚合对象。而如果遍历方式改变的话,只影响到了迭代器。
缺点:
每个聚合对象都要一个迭代器,增加了类的个数,在一定程度上增加了系统的复杂度且不好管理。