设计模式之迭代器模式

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

在软件开发过程中,因为业务的需要,我们会创建不同的集合或者数组,每次遍历取值都要重复相同的代码。在设计模式中能够将遍历进行封装,而不会暴露内部的表示,还能够提供多种不同的遍历方式。这就是迭代器模式,其UML图如下:

这里写图片描述

迭代器模式由以下组成部分:

抽象迭代器(Iterator):所有迭代器都需要实现的接口,提供了遍历元素所需要的方法。

hasNext():判断遍历是否结束
remove():移除当前对象
next():取得下一个元素

具体迭代器(ConcreteIterator): 利用这个具体的迭代器能够对具体的聚合对象进行遍历。每一个聚合对象都应该对应一个具体的迭代器。

抽象聚合类 (Aggregate):一般是一个接口,提供creatorIterator()方法。

具体聚合类 (ConcreteAggregate): 实现creatorIterator()方法,返回该聚合对象的迭代器。

代码部分

抽象迭代器

interface Iterator {
    public Object next();
    public boolean hasNext();
}

具体迭代器:

class ConcreteIterator implements Iterator {
    private List list = new ArrayList();
    private int index;

    public ConcreteIterator(List list) {
        this.list = list;
    }

    @Override
    public Object next() {
        Object obj = null;
        if(this.hasNext()){
            obj = this.list.get(index++);
        }
        return obj;
    }

    @Override
    public boolean hasNext() {
        if (index > list.size()) {
            return false;
        } else {
            return true;
        }
    }
}

聚集抽象类:

interface Aggregate {
    public void add(Object o);
    public void remove(Object o);
    public Iterator createIterator();
}

具体聚集类:

class ConcreteAggregate implements Aggregate {
    private List list = new ArrayList();

    @Override
    public void add(Object o) {
        list.add(o);
    }

    @Override
    public void remove(Object o) {
        list.remove(o);
    }

    @Override
    public Iterator createIterator() {
        return new ConcreteIterator(list);
    }
}

客户端调用:

 public static void main(String[] args) {
        Aggregate ag = new ConcreteAggregate();
        ag.add("1");
        ag.add("2");
        ag.add("3");
        ag.add("4");
        Iterator it = ag.createIterator();
        while(it.hasNext()){
            String str= (String)it.next();
            System.out.println(str);
        }
    }

输出结果:

这里写图片描述

代码地址:Iterator

二、模式结语

迭代器模式简化了遍历方式,对于对象集合的遍历,还是比较麻烦的,对于数组或者有序列表,我们尚可以通过游标来取得,但用户需要在对集合了解很清楚的前提下,自行遍历对象,但是对于hash表来说,用户遍历起来就比较麻烦了。而引入了迭代器方法后,用户用起来就简单的多了。

可以提供多种遍历方式,比如说对有序列表,我们可以根据需要提供正序遍历,倒序遍历两种迭代器,用户用起来只需要得到我们实现好的迭代器,就可以方便的对集合进行遍历了。

封装性良好,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心。

欢迎大家评论留言,点击查看更多设计模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值