设计模式之迭代器模式

Posted ProChick

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之迭代器模式相关的知识,希望对你有一定的参考价值。

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. 上面涉及到的这几个类,用类图表示它们的关系如下,很显然使用的是迭代器模式。

以上是关于设计模式之迭代器模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之迭代器模式

设计模式之行为型迭代器模式

设计模式之迭代器模式

设计模式之迭代器模式

JavaScript---设计模式之迭代器模式

设计模式之迭代器模式 Iterator