定义:
提供一种方法顺序访问一个聚合对象中的各个元素,而又不需暴露该对象的内部表示。
角色列表:
迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。
具体迭代器角色(ConcreteIterator):具体迭代器角色实现迭代器接口,并记录当前的遍历位置。
容器角色(Container):容器角色负责提供创建具体迭代器角色的接口。
具体容器角色(ConcreteContainer):具体容器角色实现创建具体迭代器角色的接口。
类图:
例子:
牛场要对牛进行体检,因此只需要通过牛群的聚合挨次对牛进行遍历,代码如下:
/**
* 迭代器角色
* 奶牛聚合迭代接口
* @author wang
*/
public interface Iterator {
public Cattle next();
public boolean hasNext();
}
/**
* 具体迭代器角色
* 实现牛群的迭代接口,并记录当前的位置
* @author wang
*/
public class ConcreteIterator implements Iterator {
private List<Cattle> list;
private int cursor=0;//当前游标位置
public ConcreteIterator(List<Cattle> list){
this.list = list;
}
public boolean hasNext() {
// TODO Auto-generated method stub
return !(cursor==list.size());
}
public Cattle next() {
// TODO Auto-generated method stub
Cattle cattle = null;
if(hasNext()){
cattle = list.get(cursor++);
}
return cattle;
}
}
/**
* 容器角色
* 兽医站对牛挨个体检
* @author wang
*/
public interface Veterinary {
public void add(Cattle cattle);
public void remove(Cattle cattle);
public Iterator iterator();
}
/**
* 具体容器角色
* 实现兽医对牛的挨个体检
* @author wang
*/
public class ConcreteVeterinary implements Veterinary {
private List<Cattle> list;
public ConcreteVeterinary(List<Cattle> list){
this.list = list;
}
public void add(Cattle cattle) {
// TODO Auto-generated method stub
list.add(cattle);
}
public Iterator iterator() {
// TODO Auto-generated method stub
return new ConcreteIterator(list);
}
public void remove(Cattle cattle) {
// TODO Auto-generated method stub
list.remove(cattle);
}
}
public class Client {
public static void main(String args[]){
List<Cattle> list = new ArrayList<Cattle>();
list.add(new Cattle("一号牛"));
list.add(new Cattle("二号牛"));
list.add(new Cattle("三号牛"));
list.add(new Cattle("四号牛"));
Veterinary veterinary = new ConcreteVeterinary(list);
Iterator iterator = veterinary.iterator();
while(iterator.hasNext()){
Cattle cattle = iterator.next();
System.out.println("体检:" + cattle.getName());
}
}
}
public class Cattle {
private String name;
public Cattle(String name){
this.name = name;
}
/**
* 获取name
* @return name name
*/
public String getName() {
return name;
}
/**
* 设置name
* @param name name
*/
public void setName(String name) {
this.name = name;
}
}
结果如下:
优点:
1:迭代器使用方便,无需操心内部结构
2:无需关心迭代算法
其实很多数组与列表都已经实现了迭代接口,只需调用即可,真正需要用到迭代器模式的地方并不多,学习迭代器模式方便自己理解平常使用的迭代器的原理即可。