迭代器模式
/**
* 迭代器模式:
* 提供一个方法顺序访问一个聚合对象的各个元素,而又不暴露对象的内部实现
* 需要为不同的聚集结构提供开始 下一个 是否结束 当前为哪一项等统一接口
* 该模式已经被提议撤销
* foreach in ,等就是该模式的提现
*
* 应用场景:
* 当你需要方位一个聚合对象,而且不管这些对象是谁呢么都需要访问的时候,就可以考虑使用迭代器模式
* 当对聚合对象有多种方式(如顺序)进行遍历时,可以考虑吧使用迭代器模式
*
* 作用:
* 迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器来实现,
* 从而实现不暴露内部的集合,又可以让外部代码透明的访问集合内部的数据
*/
结构图
范例
public interface Aggregate {
Iterator createIterator();
int getCount();
Object get(int index);
}
public interface Aggregate {
Iterator createIterator();
int getCount();
Object get(int index);
}
public class ConcreteAggregate implements Aggregate {
public List<Object> items=new ArrayList<>();
@Override
public Iterator createIterator() {
return new ConcreteIterator(this);
}
@Override
public int getCount(){
return items.size();
}
@Override
public Object get(int index){
return items.get(index);
}
}
public class ConcreteIterator implements Iterator{
private ConcreteAggregate mAggregate;
private int current=-1;
public ConcreteIterator(ConcreteAggregate aggregate) {
mAggregate = aggregate;
}
@Override
public Object next() {
Object ret=null;
current++;
if (current<mAggregate.getCount()){
ret=mAggregate.get(current);
}
return ret;
}
@Override
public boolean hasNext() {
return current<mAggregate.getCount()-1;
}
}
//客户端调用
List<Object> strs=new ArrayList<>()
strs.add("qeqw")
strs.add("qeq123w")
strs.add("q1eqw")
strs.add("q2eqw")
strs.add("q3eqw")
ConcreteAggregate concreteAggregate = new ConcreteAggregate()
concreteAggregate.items=strs
ConcreteIterator concreteIterator = new ConcreteIterator(concreteAggregate)
while(concreteIterator.hasNext()){
Object next = concreteIterator.next()
Log.d("meee",getClass()+":\n"+"test:"+next)
}