# 23种设计模式-迭代子模式

# 1.迭代子模式

又叫游标(Cursor)模式,是对象的行为模式。迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象。

# 优缺点

# 优点:

多态迭代:为不同的聚合结构提供一致的遍历接口,即一个迭代接口可以访问不同的聚集对象; 简化聚集对象接口:迭代器模式 将聚集对象本身应该提供的元素迭代接口抽取到了迭代器中,使聚集对象无须关心具体迭代行为; 元素迭代功能多样化:每个聚集对象都可以提供一个或多个不同的迭代器,使的同种元素聚合结构可以有不同的迭代行为; 解耦迭代与聚集:迭代器模式 封装了具体的迭代算法,迭代算法的变化,不会影响到聚集对象的架构;

# 缺点:

对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐;

# 使用场景

# 实现方式

# 抽象迭代子:

public interface Itertor {

    /**
     * 移动到第一个元素
     */
    public void first();
    
    /**
     * 迭代方法:移动到下一个元素
     */
    public void next();
    
    /**
     * 迭代方法:是否为最后一个元素
     */
    public boolean isDone();
    
    /**
     * 迭代方法:返还当前元素
     */
    public Object currentItem();

}

# 抽象聚集

/**
 * 抽象聚集
 *
 */
public abstract class AbsAggregate {
    
    /**
     * 暴露一个创造迭代器的方法
     */
    public abstract Itertor createItertor();
}

# 具体迭代子

public class ConcreteItertor implements Itertor{

    // 具体聚集器
    private ConcreteAggregater agg;
    
    //目前索引位置
    private int currentIndex;
    
    //聚集器大小
    private int aggreSize;
    
    public ConcreteItertor(ConcreteAggregater agg) {
        this.agg = agg;
        this.currentIndex = 0;
        this.aggreSize = agg.size();
    }

    @Override
    public void first() {
        currentIndex = 0;
    }

    @Override
    public void next() {
        if(currentIndex<aggreSize){
            currentIndex++;
        }
    }

    @Override
    public boolean isDone() {
        return currentIndex > aggreSize-1;
    }

    @Override
    public Object currentItem() {
        return agg.getElement(currentIndex);
    }

}

# 具体聚集

public class ConcreteAggregater extends AbsAggregate {

    private Object[] objectArray;
    
    public ConcreteAggregater(Object[] objArray) {
        this.objectArray = objArray;
    }
    
    @Override
    public Itertor createItertor() {
        return new ConcreteItertor(this);
    }
    
    public int size(){
        return objectArray.length;
    }

    /**
     * 提供获取尺寸的方法
     */
    public Object getElement(int index){
        if(index<size()){
            return objectArray[index];
        }else{
            return null;
        }
    }

}

# 测试类

public class Client {
    public static void main(String[] args) {
        Object[] objects = {"one","two","three","four","five"};
        AbsAggregate agg = new ConcreteAggregater(objects);
        Itertor it = agg.createItertor();
        while(!it.isDone()){
            System.out.println(it.currentItem());
            it.next();
        }
    }
}

参考博客:https://www.jianshu.com/p/6f8194ef46ee