1、什么是Iterator
在要遍历一个数组的时候,可以通过一个for循环语句来达到目的。
for(int i=1;i<arr.length;i++){
System.out.println(arr[i]);
}
而for循环的关键是通过i的递增来实现数组遍历,因此,我们将这种逐渐递增的i的功能抽象化,就成为了设计模式了的Iterator模式。
Iterator模式主要用于在一个数据集中进行遍历。
2、角色分析
·抽象的迭代器(接口)
抽象的迭代器,作为通用的接口。在该迭代器中需要有的功能为:
hasNext:判断是否有下一个元素。(相当于for循环体里 i<arr.legth)
next:获取当前元n素,并使迭代器指向下一个元素。(相当于i++)
·具体的迭代器
负责具体实现抽象迭代器中的方法。包含了遍历集合所必须的信息。
·抽象的集合
该角色创建了Iterator角色的接口。这个接口只含有一个方法即使用迭代器的方法,会创建出“按照顺序访问保存在我内部元素的人”。
·具体的集合
负责实现抽象的集合内的方法,并创建具体的要迭代的角色。
3、代码示例
创建一支军队,需要依次遍历军队中的士兵。
创建士兵类
class Solider{
private String name;
public Solider(String name) {
this.name=name;
}
public String getName() {
return this.name;
}
}
创建抽象迭代器
interface Iterator{
public abstract boolean hasNext();
public abstract Object next();
}
创建抽象集合
interface Aggregate{
public abstract Iterator iterator();
}
创捷具体的迭代器
由于next方法将迭代器指向了后一个元素,所以在访问到最后一个元素时就无需在迭代下去了。所以hasNext在最后一个元素的返回值应为false
class TroopIterator implements Iterator{
private Troop troop;
private int index;
public TroopIterator(Troop troop) {
this.troop=troop;
this.index=0;
}
public boolean hasNext() {
if(index<troop.getNum()) {//在未访问最后一个元素前返回为真
return true;
}else {
return false;
}
}
public Object next() {
Solider solider=troop.getSoliderAt(index);
index++;
return solider;
}
}
创建具体的集合
在除了实现接口外,需要构成一个元素数组。
class Troop implements Aggregate{
private Solider[] soliders;
private int last=0;
public Troop(int num) {
this.soliders=new Solider[num];
}
public Solider getSoliderAt(int index) {
return this.soliders[index];
}
public void unitTroop(Solider solider) {
this.soliders[this.last]=solider;
this.last++;
}
public int getNum() {
return last;
}
public Iterator iterator() { //这一步相当于是吧这个数组传进了迭代器中
return new TroopIterator(this);
}
}
测试
public class Text {
public static void main(String[] args) {
// TODO Auto-generated method stub
Troop troop = new Troop(5);
troop.unitTroop(new Solider("Frisk"));
troop.unitTroop(new Solider("Toriel"));
troop.unitTroop(new Solider("Sans"));
troop.unitTroop(new Solider("Papyrus"));
troop.unitTroop(new Solider("Mettaton"));
Iterator it =troop.iterator();
while(it.hasNext()) {
Solider solider = (Solider)it.next();
System.out.println(solider.getName());
}
}
}
Frisk
Toriel
Sans
Papyrus
Mettaton
4、总结
迭代器模式相当于规范了遍历元素的方式,使得在一些元素复杂的情况下可以通过迭代器来进行数组遍历。通过创建迭代器的接口和集合的接口降低了代码的耦合度,增加了代码的多用性。