本文介绍23种设计模式之迭代器模式。
定义
提供一个方法顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示。
描述
- 模式名称:ITERATOR(迭代器)
- 类型:对象行为型模式
- 意图:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。
- 适用性:
- 访问一个聚合对象的内容而无需暴露它的内部表示。
- 支持对聚合对象的多种遍历。
- 为遍历不同的聚合结构提供一个统一的接口。
- 效果:
- 优点:
- 它支持以不同的方式遍历一个聚合,复杂的聚合可用多种方式进行遍历。
- 迭代器简化了聚合的接口。
- 缺点:
- 类的个数容易过多,增加复杂度。
类图
- 抽象聚合(Aggregate)角色:提供一个共同的接口供所有聚合使用。
- 具体聚合(ConcreteAggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。
- 抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、remove()、next() 等方法。
- 具体迭代器(Concretelterator)角色:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。
实现代码
Aggregate
public interface Aggregate {
Iterator createIterator();
}
ConcreteAggregate
public class ConcreteAggregate implements Aggregate {
private ArrayList<String> list;
public ConcreteAggregate(ArrayList<String> list){
this.list = list;
}
@Override
public Iterator createIterator() {
return new ConcreteIterator(list);
}
}
Concretelterator
public class ConcreteIterator implements Iterator {
ArrayList<String> list;
private int index = 0;
public ConcreteIterator(ArrayList<String> list) {
this.list = list;
}
@Override
public boolean hasNext() {
return index<list.size();
}
@Override
public Object next() {
return list.get(++index);
}
@Override
public void remove() {
if(index<=0){
throw new IllegalStateException("当前没有数据,无法删除");
}else {
list.remove(--index);
}
}
}