迭代器模式
基本介绍
1)属于行为型模式
2)如果我们的集合元素是用不同的方式实现的,有数组,还有java的集合类或者还有其他方式当客户端要遍历这些集合元素的时候就要使用多种遍历方式,而且还会暴露元素的内部结构,可以考虑使用 迭代器 模式
3)迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即:不需要暴露其内部的结构
迭代器模式的注意事项和细节
>优点
1)提供一个统一的方法遍历对象,客户不用再考虑聚合的类型,使用一种方法就可以遍历对象了
2)隐藏了聚合的内部结构,客户端要遍历聚合的时候只能取到迭代器,而不会知道聚合的具体组成
3)提供了一种设计思想,就是一个类应该只有一个引起变化的原因,在聚合类中,我们把迭代器分开,就是要把管理对象集合和遍历对象集合的责任分开,这样一来集合改变的话,只影响到聚合对象。而如果遍历方式改变的话,只影响到迭代器
4)当前展示一组相似对象,或者遍历一组相同对象时使用,适合使用迭代器模式
>缺点
每个聚合对象都要一个迭代器,会生成多个迭代器不好管理类
类图

案例代码
package com.example.demo.design. iterator ;
public interface Aggregate {
void add(Object obj);
void remove(Object obj);
Iterator getIterator();
}
package com.example.demo.design.iterator;
import java.util.ArrayList;
import java.util.List;
public class ConcreteAggregate implements Aggregate{
private List<Object> list = new ArrayList<>();
@ Override
public void add(Object obj) {
list.add(obj);
}
@Override
public void remove(Object obj) {
list.remove(obj);
}
@Override
public Iterator getIterator() {
return new ConcreteIterator(list);
}
}
package com.example.demo.design.iterator;
import java.util.List;
public class ConcreteIterator implements Iterator{
private List<Object> list = null;
private int index = -1;
public ConcreteIterator(List<Object> list){
this.list = list;
}
@Override
public Object first() {
index = 0;
Object obj = list.get(index);
return obj;
}
@Override
public Object next() {
Object obj = null;
if(this.hasNext()){
obj = list.get(++index);
}
return obj;
}
@Override
public boolean hasNext() {
if(index < list.size() - 1){
return true;
}
return false;
}
}
package com.example.demo.design.iterator;
public interface Iterator {
Object first();
Object next();
boolean hasNext();
}
package com.example.demo.design.iterator;
public class Client {
public static void main(String[] args) {
Aggregate at = new ConcreteAggregate();
at.add("1");
at.add("2");
at.add("3");
at.add("4");
Iterator iterator = at.getIterator();
while (iterator.hasNext()){
Object ob = iterator.next();
System.out.println(ob);
}
System.out.println("---------");
Object first = iterator.first();
System.out.println("first : " +first);
}
}
结果

迭代器模式在JDK-ArrayList中的应用
/**
* Returns an iterator over the elements in this list in proper sequence.
*
* <p>The returned iterator is <a href="#fail-fast"><i>fail-fast</i></a>.
*
* @return an iterator over the elements in this list in proper sequence
*/
public Iterator<E> iterator() {
return new Itr();
}