设计模式之迭代器模式

1.简要概述

  • 迭代器模式也叫作游标模式,它提供了一种顺序访问聚合对象元素的方法,并且不暴露聚合对象的内部表示。
  • 迭代器模式的主要思想是将集合的遍历行为抽取为单独的迭代器对象,所有迭代器必须实现相同的接口,这样一来,只要有合适的迭代器,客户端就能兼容任何类型的集合或遍历算法。

2.模式结构

👉通常由一个迭代器接口( 负责定义对集合对象中元素进行获取的相关方法 ),多个具体的迭代器类( 负责为特定集合实现迭代器接口中的方法 ),一个统一的聚合接口( 负责定义获取对应迭代器的方法),多个具体的聚合类( 负责管理集合对象,并通过获取对应的迭代器实现集合元素的遍历),一个客户类( 负责调用特定的聚合类和迭代器类)共同组成。

请添加图片描述

3.实现代码

举例 💡 :假设我们要对一个学校的所有学院进行遍历输出,那么就可以使用迭代器模式进行处理。

迭代器接口

public interface Iterator<T> {

    T next();

    boolean hasNext();
}

具体迭代器类

public class AcademyIterator<T> implements Iterator {

    private T[] items;
    private int position = 0;

    public ConcreteIterator(T[] items) {
        this.items = items;
    }

    @Override
    public T next() {
        T t = items[position];
        position += 1;
        
        return t;
    }

    @Override
    public boolean hasNext() {
        return position < items.length - 1;
    }
}

学院类

public class Academy{
    private String name;
    
    public Academy(String name){
        this.name = name;
    }
    
    public String getName(){
        return name;
    }
}

聚合接口

public interface Aggregate {
    Iterator getIterator();
}

具体聚合类

public class AcademyAggregate implements Aggregate {

    private Academy[] academys;

    public AcademyAggregate() {
        academys = new Academy[3];
        for (int i = 0; i < items.length; i++) {
            academys[i] = new Academy("学院" + i);
        }
    }

    @Override
    public Iterator getIterator() {
        return new AcademyIterator<Academy>(academys);
    }
}

客户类

// 测试客户端
public class AcademyClient{
    public static void main(String[] args) {
        Aggregate aggregate = new AcademyAggregate();
        Iterator<Academy> iterator = aggregate.createIterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next().getName);
        }
    }
}

4.优点好处

  • 迭代器模式提供了一个统一的方法来遍历对象,使得客户端不需要考虑聚合的类型,就能够对集合进行遍历。
  • 迭代器模式隐藏了聚合的内部结构,使得客户端在遍历集合的时候,只需获取对应的迭代器即可,而不需要知道聚合的具体组成部分。
  • 迭代器模式满足单一责任原则,它把管理对象集合和遍历对象集合的任务隔离开来,使得它们互不影响。

5.缺点弊端

  • 对于一些特殊集合,使用迭代器可能比直接遍历的效率低。
  • 由于迭代器模式将管理数据和遍历数据的职责分离,增加新的聚合类就需要增加新的迭代器类,所以当系统中存在很多聚合类的时候,就会在一定程度上增加了系统的复杂性。

6.应用场景

  • 当我们要遍历那些集合元素是用不同的方式实现的集合,然后提供一个统一的接口进行访问时,可以考虑使用迭代器模式。
  • 当我们需要为聚合对象提供多种遍历方式时,可以考虑使用迭代器模式进行遍历。
  • 当我们访问一个聚合对象,但是不想暴露它的内部表示时,可以考虑使用迭代器模式。

7.应用示例

JDK源码中的ArrayList类的迭代器使用

  1. JDK中的List接口就好比是聚合接口,里面定义了获取迭代器对象的方法。

    请添加图片描述

  2. JDK中的ArrayList类就好比是具体的聚合类,它实现了List接口中的获取迭代器的方法,并且定义了集合对象。

    请添加图片描述

    请添加图片描述

  3. JDK中的Iterator类就是迭代器接口,里面定义了获取集合对象元素的相关方法,比如hasNext方法。

    请添加图片描述

  4. JDK中的Itr类就是具体的迭代器,它实现了Iterator接口中的方法,能够获取具体集合对象中的元素。

    请添加图片描述

  5. 上面涉及到的这几个类,用类图表示它们的关系如下,很显然使用的是迭代器模式。

    请添加图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程小吉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值