定義:
提供一種方法順序訪問一個容器對象中的各個元素要拂,而又不需要暴露該對象的內(nèi)部表示
應(yīng)用場景:
迭代器模式是與集合共生共死的堰氓,一般來說袄秩,我們只要實現(xiàn)一個集合,就需要同時提供這個集合的迭代器裆赵,就像java中的Collection东囚,List、Set战授、Map等页藻,這些集合都有自己的迭代器。假如我們要實現(xiàn)一個這樣的新的容器植兰,當(dāng)然也需要引入迭代器模式份帐,給我們的容器實現(xiàn)一個迭代器。
案例:
- 抽象迭代接口類
public interface Iterator<T> {
//是否還有下一個元素
boolean hasNext();
T next();
}
- 具體迭代類
//具體的迭代角色
public class ConcreteItetor<T> implements Iterator<T> {
private List<T> list=new ArrayList<>();
public ConcreteItetor(List<T> list) {
this.list = list;
}
private int cursor=0;
@Override
public boolean hasNext() {
return cursor!=list.size();
}
@Override
public T next() {
T obj=null;
if(this.hasNext()){
obj=list.get(cursor++);
}
return obj;
}
}
- 抽象容器類
//容器接口
public interface Aggregate<T> {
void add(T t);
void remove(T t);
Iterator<T> iteratoe();
}
- 具體容器類
//具體的容器
public class ConcreteAggregate<T> implements Aggregate<T> {
private List<T> list=new ArrayList<>();
@Override
public void add(T t) {
list.add(t);
}
@Override
public void remove(T t) {
list.remove(t);
}
@Override
public Iterator<T> iteratoe() {
return new ConcreteItetor<>(list);
}
}
- 客戶頓調(diào)用
public class MyClass {
public static void main(String[] args){
Aggregate<String> aggregate=new ConcreteAggregate<>();
aggregate.add("張三");
aggregate.add("李四");
Iterator<String> iterator=aggregate.iteratoe();
while (iterator.hasNext()){
System.out.print(iterator.next()+"\n");
}
}
}
張三
李四
- 總結(jié)
由于容器與迭代器的關(guān)系太密切了楣导,所以大多數(shù)語言在實現(xiàn)容器的時候都給提供了迭代器废境,并且這些語言提供的容器和迭代器在絕大多數(shù)情況下就可以滿足我們的需要,所以現(xiàn)在需要我們自己去實踐迭代器模式的場景還是比較少見的筒繁,我們只需要使用語言中已有的容器和迭代器就可以了噩凹。