这是我参与更文挑战的第14天,活动详情查看:更文挑战
迭代器模式
迭代器模式也可以叫做游标模式,是行为设计模式之一,是对容器访问的一种方式。对于容器对象访问必然涉及到遍历算法,遍历的形式就是迭代器了。其在访问和容器之间插入迭代器,将容器和迭代功能隔离,容器类只需要维护自身内部数据,不关心遍历操作方法。
实战
Iterator代表迭代器接口,一共两个方法next获取下个容器内部成员,hasNext判断是否还有容器内部成员;ConcreteIterator是具体迭代器,具有一个cursor下标和list当做遍历时根据当前cursor获取下一个容器成员对象;Aggregate是容器接口,add可添加内部成员,remove可移除内部成员,获取迭代器iterator功能;ConcreteAggregate是具体容器类实现接口方法,这里主要是为了获取迭代器。当需要做遍历操作时获取到迭代器,内部已经实现了具体迭代器类,当调用next可通过下标获取到容器内部具体某个成员。
// 迭代器接口
public interface Iterator<T>{
T next();
boolean hasNext();
}
/// 具体迭代器
public class ConcreteIterator<T> implements Iterator<T>{
private List<T> list = new ArrayList<T>();
private int cursor = 0;
public ConcreteIterator(List<T> list){
this.list = list;
}
@override
boolean hasNext(){
return cursor != list.size();
}
@override
public T next(){
T obj = null;
if(this.hasNext()){
obj = this.list.get(cursor ++);
}
return obj;
}
}
// 容器接口
public interface Aggregate<T>{
void add(T obj);
void remove(T obj);
Iterator<T> iterator();
};
/// 具体容器类
public class ConcreteAggregate<T> implements Aggregate<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 ConcreteIterator<T>(list);
}
}
/// 实现
Aggregate<String> a = new ConcreteAggregate<>();
a.add("1");
a.add("2");
a.add("3");
a.add("4");
Iterator<String> i = a.iterator();
while(i.hasNext()){
....
}
复制代码
总结
迭代器模式的优点:支持不同方式遍历一个容器对象,弱化容器和遍历算法之间的关系。
迭代器模式的缺点:设计模式的通病,增加类文件数量。
在开发语言中事实上它们的容器类都有相应的迭代器功能,高级语言基本都已经内置实现,对于开发者而言更多的是理解和了解如何去使用,并不需要自行开发实现迭代器了。开发者更多关注在某个业务场景使用哪种迭代器更合适,效率更高。
参考
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END