迭代模式(Iterator Pattern) – 设计模式之行为模式:
目录
迭代模式(Iterator Pattern)
定义: Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.
提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式。
迭代器模式分离了集合对象的遍历行为,抽象出一个迭代器类来负责。
类图
迭代模式通用类图:
例子-遍历:
过程:
实现类似List增加、删除和遍历数据
类图:
代码:
抽象迭代器 Iterator
抽象迭代器负责定义访问和遍历元素的接口,而且基本上是有固定的3个方法:first()获得第一个元素,next()访问下一个元素,hasNext()是否已经访问到底部
public interface Iterator<T> {
T first();
boolean hasNext();
T next();
}
具体迭代器 ConcreteIterator
具体迭代器角色要实现迭代器接口,完成容器元素的遍历。
public class ConcreteIterator implements Iterator {
private Vector vector;
//定义当前游标
private int cursor = 0;
@SuppressWarnings("unchecked")
public ConcreteIterator(Vector _vector){
this.vector = _vector;
}
//返回第一个元素
@Override
public Object first() {
if(this.vector.size()>0){
return this.vector.get(NumberUtils.INTEGER_ZERO);
}
return null;
}
//判断是否到达尾部
@Override
public boolean hasNext() {
if(this.cursor == this.vector.size()){
return false;
}
return true;
}
注意 开发时,迭代器的删除方法应该完成两个逻辑:一是删除当前元素,二是当前游标指向下一个元素。
抽象容器 Aggregate
容器角色负责提供创建具体迭代器角色的接口,必然提供一个类似createIterator()这样的方法。
public interface Aggregate<T> {
void add(T object); // 增加元素
void remove(T object); // 删除元素
Iterator getIterator(); // 遍历所有的元素
}
具体容器 ConcreteAggregate
具体容器实现容器接口定义的方法,创建出容纳迭代器的对象。
public class ConcreteAggregate implements Aggregate {
//容纳对象的容器
private Vector vector = new Vector();
@Override
public void add(Object object) {
this.vector.add(object);
}
@Override
public void remove(Object object) {
this.vector.remove(object);
}
@Override
public Iterator getIterator() {
return new ConcreteIterator(this.vector);
}
}
测试:
public class ItetatorTest {
public static void main(String[] args) {
Aggregate aggregate = new ConcreteAggregate();
String dream = "dream";
aggregate.add("yan");
aggregate.add(1222);
aggregate.add(86.5);
aggregate.add(dream);
Iterator iterator = aggregate.getIterator();
System.out.println("first: "+iterator.first());
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
System.out.println("============ remove ============");
aggregate.remove(dream);
iterator = aggregate.getIterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
结果:
first: yan
yan
1222
86.5
dream
============ remove ============
yan
1222
86.5
简单来说,迭代器就类似于一个数据库中的游标,可以在一个容器内上下翻滚,遍历所有它需要查看的元素。
总结:
优点:
1、它支持以不同的方式遍历一个聚合对象。
2、迭代器简化了聚合类。
3、在同一个聚合上可以有多个遍历。
4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
缺点: 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
使用场景
1、访问一个聚合对象的内容而无须暴露它的内部表示。
2、需要为聚合对象提供多种遍历方式。
3、为遍历不同的聚合结构提供一个统一的接口。
在Java开发中,尽量不要自己写迭代器模式!使用Java提供的Iterator一般就能满足你的要求了。