研磨设计模式之迭代器

来源:互联网 发布:淘宝客服应聘个人简历 编辑:程序博客网 时间:2024/04/30 01:39

聚合

指一组对象的组合结构,如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();}