前言
迭代器模式又称为游标模式,源于对容器的访问,比如java中的List、Map、数组等,提供一个合理的遍历访问。用法就是在用户访问类,和容器之间插入一个迭代器,提供遍历访问。这样做可以让容器功能保持单一,不用在容器内实现遍历功能。也不用对外提供内部访问方法导致细节暴露。
迭代器模式定义
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
例子
废话再多,也不如一个例子来的干脆。
1、先写一个迭代器
抽象迭代器方法
public interface Iterator<T> {
boolean hasNext();
T next();
}
实现迭代器
public class IteratorImpl<T> implements Iterator<T> {
private List<T> list = new ArrayList<T>();
private int cursor = 0;
public IteratorImpl(List<T> list) {
this.list = list;
}
@Override
public boolean hasNext() {
return cursor != list.size();
}
@Override
public T next() {
T obj = null;
if (this.hasNext()) {
obj = this.list.get(cursor++);
}
return obj;
}
}
迭代器核心其实就是给带入的list提供一个遍历的方法。
2、写一个容器
抽象容器方法
public interface Container<T> {
void add(T obj);
void remove(T obj);
Iterator<T> iterator();
}
实现容器
public class ContainerImpl<T> implements Container<T> {
private List<T> list = new ArrayList<T>();
@Override
public void add(T obj) {
list.add(obj);
}
@Override
public void remove(T obj) {
list.remove(obj);
}
@Override
public Iterator<T> iterator() {
return new IteratorImpl<>(list);
}
}
我们使用容器的时候,只要提供一个构建迭代器的方法就可以了。迭代器自行对外提供遍历方法。
3、客户端调用
// 创建一个容器
ContainerImpl<String> containerImpl = new ContainerImpl<>();
containerImpl.add("jack");
containerImpl.add("mom");
containerImpl.add("dad");
containerImpl.add("john");
// 根据容器创建一个迭代器
Iterator<String> iterator = containerImpl.iterator();
// 迭代器提供遍历方法,遍历
while (iterator.hasNext()) {
Log.d("Iterator",iterator.next());
}
log输出如下:
11-26 19:01:43.249 28429-28429/com.yink.designpattern.designpattern D/Iterator: jack
11-26 19:01:43.249 28429-28429/com.yink.designpattern.designpattern D/Iterator: mom
11-26 19:01:43.249 28429-28429/com.yink.designpattern.designpattern D/Iterator: dad
11-26 19:01:43.249 28429-28429/com.yink.designpattern.designpattern D/Iterator: john
迭代器模式小结
迭代器模式结构很简单,就是提供一个list的遍历方法。目的很明确,弱化遍历算法和容器之间的关系。其实我们平时开发之中已经很少需要自己去实现迭代器,因为现在不管是Object,C++,python等等,他们直接实现了这种结构。但是理解这种设计模式也是不错的。像Android源码中数据库中的游标Cursor也是用的这种结构。
结束语
迭代器模式比较简单,也没啥多说的,最后强调迭代器模式记忆要点:根据传入的list额外提供一个遍历方法。