1.使用场景:
1.1访问一个聚合对象的内容而无需暴露它的内部表示
1.2支持对聚合对象的多种遍历
1.3为遍历不同的聚合结构提供一个统一的接口
其实就是为方便遍历数据服务,像JDK的内置迭代器,就是采用的这种模式。
2.UML表示
迭代器模式主要有以下的角色构成:
2.1迭代器角色:定义遍历元素所需要的方法。
2.2具体迭代角色:实现迭代器接口中定义的方法,完成集合的迭代。
2.3容器角色:一个接口,提供iterator()方法,对比于java中的Collection接口、List接口、Set接口等。
2.4具体容器角色
抽象容器的具体实现类,比如:List接口中的ArrayList、LinkedList等。
具体的UML示意图如下:
3.代码实现
下面我们通过一个例子来对这个设计模式进行讲解:
首先,我们定义一个迭代器的接口:
public interface MyIterator {
void first();
void next();
boolean hasNext();
boolean isFirst();
boolean isLast();
Object getCurrentObj();
}
实现具体的迭代器:
public class ConcreateIterator implements MyIterator{
private List list;
private int cursor;
public ConcreateIterator(List list) {
this.list = list;
}
@Override
public void first() {
cursor=0;
}
@Override
public void next() {
if (cursor<list.size()){
cursor++;
}
}
@Override
public boolean hasNext() {
if (cursor<list.size()){
return true;
}
return false;
}
@Override
public boolean isFirst() {
return cursor==0?true:false;
}
@Override
public boolean isLast() {
return cursor == (list.size() - 1) ? true : false;
}
@Override
public Object getCurrentObj() {
return list.get(cursor);
}
}
定义容器角色:
public interface MyAggregate {
void addObject(Object object);
void removeObject(Object object);
MyIterator createIterator();
}
具体容器类:
public class ConcreteMyAggregate implements MyAggregate{
private List<Object> list;
public ConcreteMyAggregate(List<Object> list) {
this.list = list;
}
@Override
public void addObject(Object object){
this.list.add(object);
}
@Override
public void removeObject(Object object){
this.list.remove(object);
}
/**获取迭代器*/
@Override
public MyIterator createIterator(){
return new ConcreateIterator(list);
}
}
4.总结
通过迭代器模式,简化了遍历的方式,由于迭代器内部已经实现了迭代算法,所以我们不需要了解遍历的算法,使得代码的封装性比较好。
下面给出代码:
https://github.com/MemoryExplosion/design_pattern_review/tree/master/src/java/iterator