设计模式:迭代器模式
一、定义:
提供一种方法顺序访问一个容器对象中的各个元素,而不需要暴露该对象的内部表示。
迭代器模式又称为游标模式,源于对容器的访问,比如java中的List、Map、数组等,提供一个合理的遍历访问。用法就是在用户访问类,和容器之间插入一个迭代器,提供遍历访问。这样做可以让容器功能保持单一,不用在容器内实现遍历功能。也不用对外提供内部访问方法导致细节暴露。
二、角色
- Aggregate:容器接口,负责提供创建具体迭代器角色;
- ConcreteAggregate:具体容器类;
- Iterator:迭代器接口,负责定义、访问和遍历元素的接口;
- ConcreteIterator:具体迭代器类,实现迭代器接口,并记录遍历的当前位置;
三、模板代码
迭代器接口
public interface Iterator {
/**
* 是否还有下一个元素
*/
boolean hasNext();
/**
* 返回当前位置的元素并将位置移至下一位
*/
Object next();
}
具体迭代器类
class ConcreteIterator
implements Iterator { private List<T> list;
public ConcreteIterator(List<T> list) {
this.list = list;
}
/**
* 当前位置
*/
private int cursor = 0;
@Override
public boolean hasNext() {
return cursor != list.size();
}
@Override
public Object next() {
T obj = null;
if (hasNext()) {
obj = list.get(cursor++);
}
return obj;
}
}
容器接口
interface Aggregate
{ void add(T obj);
void remove(T obj);
Iterator<T> iterator();
}
具体的容器类
class ConcreteAggregate
implements Aggregate { private List<T> list = new ArrayList<>();
@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 ConcreteIterator<T>(list);
}
}
Client
public class Client {
public static void main(String[] args) {
ConcreteAggregate<String> concreteAggregate = new ConcreteAggregate<>();
concreteAggregate.add("1");
concreteAggregate.add("2");
concreteAggregate.add("3");
concreteAggregate.add("4");
Iterator<String> iterator = concreteAggregate.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
四、Android源码中的迭代器模式
各种list、map集合
数据库数据查询Cursor
五、优缺点
优点:
支持以不同的方式去遍历一个容器对象,也可以有多个遍历,弱化了容器类与遍历算法之间的关系;缺点:
类文件的增加;
还没有评论,来说两句吧...