研磨设计模式之迭代器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/oXinYangonly/article/details/78108642

聚合

指一组对象的组合结构,如Java中的集合、数组等

迭代器模式

提供一种方法,顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示

目标

以一个统一的方式来访问内部实现不同的聚合对象

示例代码

  • 迭代器接口
/**
 * 迭代器接口,定义访问和遍历元素的操作
 *
 */
public interface Iterator {

    /**
     * 移动到聚合对象的第一个位置
     */
    public void first();
    /**
     * 移动到聚合对象的下一个位置
     */
    public void next();

    /**
     * 判断是否已经移动到聚合对象的最后一个位置
     * @return true表示已经移动到聚合对象的最后一个位置
     *         false 表示还没有移动到聚合对象的最后一个位置
     */
    public boolean isDone();
    /**
     * 获取迭代的当前元素
     * @return 迭代的当前元素
     */
    public Object currentItem();
}
  • 聚合对象的接口
/**
 * 聚合对象的接口,定义创建相应迭代器对象接口
 *
 */
public abstract class Aggregate {

    /**
     * 工厂方法,创建相应迭代器对象的接口
     * @return 相应迭代器对象的接口
     */
    public abstract Iterator createIterator();
}
  • 迭代器实现对象

/**
 * 具体的迭代器实现对象,示意的是聚合对象为数组的迭代器
 * 不同的聚合对象,相应的迭代器实现是不一样的
 */
public class ConcreteIterator implements Iterator{
    /**
     * 持有被迭代的具体的聚合对象
     */
    private ConcreteAggregate aggregate;
    /**
     * 内部索引,记录当前被迭代到的索引位置
     * -1 表示刚开始的时候,迭代器指向聚合对象第一个元素之前
     */
    private int index = -1;

    /**
     * 构造方法,传入被迭代的具体的聚合对象
     * @param aggregate 被迭代的具体的聚合对象
     */
    public ConcreteIterator(ConcreteAggregate aggregate) {
        this.aggregate = aggregate;
    }

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

    @Override
    public void next() {
        if(index < this.aggregate.size()) {
            index = index + 1;
        }
    }

    @Override
    public boolean isDone() {
        if(index == this.aggregate.size()) {
            return true;
        }
        return false;
    }

    @Override
    public Object currentItem() {
        return this.aggregate.get(index);
    }

}
  • 具体的聚合对象
/**
 * 具体的聚合对象,实现创建相应迭代器对象的功能
 *
 */
public class ConcreteAggregate extends Aggregate{
    /**
     * 聚合对象的具体内容
     */
    private String[] array = null;

    /**
     * 构造方法,传入聚合对象具体的内容
     * @param array 聚合对象具体的内容
     */
    public ConcreteAggregate(String[] array) {
        this.array = array;
    }

    @Override
    public Iterator createIterator() {
        return new ConcreteIterator(this);
    }
    /**
     * 获取索引相对应的元素
     * @param index 索引
     * @return 索引相对应的元素
     */
    public Object get(int index) {
        Object ret = null;
        if(index<array.length) {
            ret = array[index];
        }
        return ret;
    }
    /**
     * 获取聚合对象的大小
     * @return 聚合对象的大小
     */
    public int size() {
        return this.array.length;
    }

}
  • 使用示例
String[] names = {"张三","李四","王五","赵六"};
//创建聚合对象
Aggregate aggregate = new ConcreteAggregate(names);
//循环输出聚合对象中的值
Iterator it = aggregate.createIterator();
//首先设置迭代器到第一个元素
it.first();
while(!it.isDone()) {
    Object obj = it.currentItem();
    System.out.println(obj);
    it.next();
}

猜你喜欢

转载自blog.csdn.net/oXinYangonly/article/details/78108642