一句话定义
提供方法顺序访问容器(Array、List...)的元素,同时不暴露对象内部细节。
使用场景
容器对象需要遍历,同时不暴露内部。
实现要点
1. Iterator:迭代器接口,定义访问和遍历元素的接口。
2. ConcreteIterarot:具体迭代器,遍历,并保存当前位置。
3. Container:容器接口,创建迭代器接口。
4. ConcreteContainer:具体容器。
情景假设
集合提供迭代器访问方法(集合本身就使用迭代器模式)
实现步骤
1. 创建迭代器接口
/**
* 迭代器接口
* 提供访问、遍历元素的接口
*
* @author fengzhen
* @version 1.0, 2017/2/13
*/
public interface Iterator<T> {
/**
* 是否还有下个元素
*/
boolean hasNext();
/**
* 获取下一个元素
*/
T next();
}
2. 创建容器接口
/**
* 容器类接口
* 提供获取迭代器接口
*
* @author fengzhen
* @version 1.0, 2017/2/13
*/
public interface Container<T> {
void add(T obj);
void remove(T obj);
/**
* 返回迭代器对象
*/
Iterator getIterator();
}
3. 创建具体迭代器
/**
* 具体迭代器
*
* @author fengzhen
* @version 1.0, 2017/2/13
*/
public class ConcreteIterator implements Iterator{
private List containers;
private int position = 0;
public ConcreteIterator(List containers) {
this.containers = containers;
}
@Override
public boolean hasNext() {
return !(containers.size() <= position);
}
@Override
public Object next() {
if (hasNext()){
return containers.get(position++);
}
return null;
}
}
4. 创建具体容器
public class ConcreteContainer implements Container<String>{
private List<String> strings = new ArrayList<>();
@Override
public void add(String obj) {
strings.add(obj);
}
@Override
public void remove(String obj) {
strings.remove(obj);
}
@Override
public Iterator getIterator() {
return new ConcreteIterator(strings);
}
}
5. 使用
ConcreteContainer concreteContainer = new ConcreteContainer()
concreteContainer.add("第1条")
concreteContainer.add("第2条")
concreteContainer.add("第3条")
concreteContainer.add("第4条")
Iterator iterator = concreteContainer.getIterator()
while (iterator.hasNext()){
Log.i("info", "onCreate: ==++" + iterator.next())
}
迭代器模式仅作了解,实际应用基本不需要!