迭代器模式
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露对象的内部表示。
迭代器模式的角色构成
(1)迭代器角色(Iterator):定义遍历元素所需要的方法,一般来说会有这么三个方法:取得下一个元素的方法next(),判断是否遍历结束的方法hasNext()),移出当前对象的方法remove(),
(2)具体迭代器角色(Concrete Iterator):实现迭代器接口中定义的方法,完成集合的迭代。
(3)容器角色(Aggregate): 一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等
(4)具体容器角色(ConcreteAggregate):就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。
模拟迭代器实现
创建迭代器角色
/**
* @Author: chen
* @Description: 定义抽象迭代器
* @Date: created in 2018/8/20
* @Modified By:
*/
public interface MyIterator {
Boolean hasNext();
Object next();
}
自定一个聚集类;在聚集类内部,使用内部类的方式来定义迭代器的具体实现。
package com.chenpt.designModel.iteratorModel;
import java.util.ArrayList;
import java.util.List;
/**
* @Author: ch
* @Description: 聚集类
* @Date: created in 2018/8/20
* @Modified By:
*/
public class Aggregate {
private List<Object> list = new ArrayList<>();
public MyIterator getIterator(){
return new InnerIterator();
}
public void add(Object obj){
list.add(obj);
}
//使用内部类来定义迭代器
private class InnerIterator implements MyIterator{
int i=0;
public Boolean hasNext(){
if(i<list.size()){
return true;
}
return false;
}
public Object next(){
return list.get(i++);
}
}
}
客户端测试
public class MainTest {
public static void main(String[] args){
Aggregate aggregate = new Aggregate();
aggregate.add("上海");
aggregate.add("南京");
aggregate.add("北京");
for (MyIterator it = aggregate.getIterator();it.hasNext();){
Object o = it.next();
System.out.println(o.toString());
}
}
}
//结果
上海
南京
北京
优点:
1、它支持以不同的方式遍历一个聚合对象。
2、迭代器简化了聚合类。
3、在同一个聚合上可以有多个遍历。
4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
缺点:
由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。