Java设计模式之迭代器模式

迭代器模式(Iterator pattern): 提供一种方法顺序访问一个聚合对象中的各个元素, 而又不暴露其内部的表示。

迭代器模式的详解

类图:

这里写图片描述

角色说明:
抽象迭代器角色(Iterator):此抽象角色定义出遍历元素所需的接口。

具体迭代器角色(ConcreteIterator):具体迭代器实现了Iterator接口,并保持迭代过程中的游标位置。

抽象集合角色(Collection):集合抽象角色给出创建迭代器对象的接口。

具体集合角色(ConcreteCollection):实现了创建迭代器对象的接口,返回一个适合的具体迭代器实例。

客户端角色(Client):持有对集合机器迭代器对象的应用,调用迭代器对象的迭代接口,也有可能通过迭代器操作集合元素的增加和删除。

代码演示,抽象迭代器类:

public interface Iterator {
    /**
     * 移动到第一个元素
     */
    public void first();

    /**
     * 移动到下一个元素
     */
    public void next();

    /**
     * 判断是否是最后一个元素
     */
    public boolean isLast();

    /**
     * 获取当前元素
     */
    public Object currentItem();
}

抽象集合类:

public abstract class Collection {
    /**
     * 给出创建迭代器对象的接口
     * 
     * @return 返回迭代器
     */
    public abstract Iterator createIterator();
}

具体集合类:

public class ConcreteCollection extends Collection {

    private Object[] object = null;

    /**
     * 在构造的时候传入集合对象的内容
     * 
     * @param object
     */
    public ConcreteCollection(Object[] object) {
        this.object = object;
    }

    /**
     * 通过集合的索引向外部提供集合元素
     * 
     * @param index
     *            索引
     * @return 索引值
     */
    public Object getElement(int index) {

        if (index < object.length) {
            return object[index];
        } else {
            return null;
        }
    }

    /**
     * 返回集合的长度
     * 
     * @return
     */
    public int size() {
        return object.length;
    }

    @Override
    public Iterator createIterator() {
        // TODO Auto-generated method stub
        return new ConcreteIterator(this);
    }

}

具体迭代器类:

public class ConcreteIterator implements Iterator {
    //被迭代的集合对象
    private ConcreteCollection collection;
    // 索引位置值
    private int index = 0;
    // 集合对象的大小
    private int size = 0;

    public ConcreteIterator(ConcreteCollection collection) {
        this.collection = collection;
        this.size = collection.size();
        index = 0;
    }

    @Override
    public void first() {
        // 把索引修改成指定第一个元素
        index = 0;

    }

    @Override
    public void next() {
        // 索引移动到下一个元素
        if (index < size) {
            index++;
        }
    }

    @Override
    public boolean isLast() {
        // 判断是否为最后一个元素
        return (index >= size);
    }

    @Override
    public Object currentItem() {
        // 返回当前元素
        return collection.getElement(index);
    }

}

客户端测试类:

public class Client {  

    public static void main(String[] args) {  

          Object[] object = { "MON", "TUE", "WED", "THU", "FRI", "SAT" ,"SUN"};  
          // 创建集合对象  
          Collection collection = new ConcreteCollection(object);  
          // 迭代出集合中的值
          Iterator iterator = collection.createIterator();  
          while (!iterator.isLast()) {  
              System.out.println(iterator.currentItem());  
              iterator.next();  
          }  
    }  

}  

运行结果:
这里写图片描述

迭代器模式的使用场景

  • 访问一个聚合对象的内容而无需暴露它的内部表示
  • 支持对聚合对象的多种遍历
  • 为遍历不同的聚合结构提供一个统一的接口。

迭代模式的优点:

  • 简化了遍历方式,对于数组或者有序列表,我们是可以通过游标来获得的。但是用户需要在对集合了解很清楚的情况下,执行遍历对象。但是对于hash表来说,遍历起来还是比较繁琐的。而引入迭代器方法后,操作起来就简单多了。
  • 可以实现多种遍历方式,比如有序列表,可以想办法实现正反两种迭代的顺序。操作起来只需要得到迭代器对象就可以进行对集合的遍历。
  • 封装性良好,客户端只需要得到迭代器就可以进行操作,而对于遍历算法则不用关心。

缺点:

  • 对于简单的遍历(像数组或有序列表),使用迭代器方式遍历还是较为繁琐的。这种情况下使用for循环更为方便。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值