迭代器模式
标签 : Java与设计模式
迭代器模式: 提供一种方法顺序访问聚合对象(如
List
、Set
)内的每个元素, 而又不暴露聚合对象的内部实现.
(图片来源: 设计模式: 可复用面向对象软件的基础)
模式实现
Iterator & Aggregate
- Iterator: 迭代器
定义访问和遍历元素的接口 - Aggregate: 聚合
定义创建响应迭代器对象的接口
由于Java已内置了java.lang.Iterable
和java.util.Iterator
接口, 而Iterable
可以作为Aggregate存在(Abstract), 因此在Java中实现迭代器便可不用再定义这两个接口.
ConcreteAggregate & ConcreteIterator
- ConcreteAggregate: 具体聚集
实现Iterable
接口, 返回ConcreteIterator的一个适当的实例; - ConcreteIterator : 具体迭代器
实现Iterator
接口(最好作为具体聚集的内部类), 对该聚集遍历时跟踪当前位置.
/**
* @author jifang
* @since 15/12/15 下午8:33.
*/
public class ConcreteAggregate implements Iterable<String> {
private List<String> list;
public ConcreteAggregate() {
this.list = new ArrayList<>();
}
public void add(String item) {
list.add(item);
}
public String get(int index) {
return list.get(index);
}
@Override
public Iterator<String> iterator() {
return new ConcreteIterator();
}
/**
* 具体迭代器实现类
*/
private class ConcreteIterator implements Iterator<String> {
// 游标
int cursor = 0;
// 比游标慢一个元素
int lastRet = -1;
@Override
public boolean hasNext() {
return cursor != list.size();
}
@Override
public String next() {
if (cursor >= list.size())
throw new NoSuchElementException();
++cursor;
return list.get((lastRet = cursor - 1));
}
@Override
public void remove() {
list.remove(lastRet);
cursor = lastRet;
lastRet = -1;
}
}
}
- Client
public class Client {
@Test
public void client(){
ConcreteAggregate aggregate = new ConcreteAggregate();
aggregate.add("aa");
aggregate.add("bb");
aggregate.add("remove");
aggregate.add("cc");
aggregate.add("dd");
aggregate.add("remove");
aggregate.add("ee");
Iterator<String> iter = aggregate.iterator();
while (iter.hasNext()){
String item = iter.next();
System.out.println(item);
if (item.equals("remove")){
iter.remove();
}
}
System.out.println("********----------********");
for (String item : aggregate){
System.out.println(item);
}
}
}
小结
适用
- 访问一个聚集对象的内容而无需暴露它的内部表示;
- 支持对聚集对象的多种遍历(如: 不光可以正向遍历, 还可以反向遍历容器元素.);
- 为遍历不同的聚合结构提供一个统一的接口(即: 支持多态迭代).
Iterator
使用场景不必多言, 由于Java已经将其固化到语言中,因此开发中天天都在使用:- 当需要访问一个聚集对象, 且不需要了解其内部实现的时, 就应该考虑使用迭代器模式.
- 当需要对聚集有多种方式遍历时, 可以考虑使用迭代器模式.
- by 攻城师@翡青
- Email: feiqing.zjf@gmail.com
- 博客: 攻城师-翡青 - http://blog.csdn.net/zjf280441589
- 微博: 攻城师-翡青 - http://weibo.com/u/3319050953