java 设计模式_行为型_15迭代器模式

发布于:2025-06-15 ⋅ 阅读:(17) ⋅ 点赞:(0)

15.迭代器模式

定义:我们可以用相同的方式处理集合,无论它是列表还是数组,它都提供了一种迭代其元素而不用暴露其内部结构的机制,更重要的是,不同的类型的集合都可以使用相同的统一机制,这种机制则被称为 迭代器模式。
目的:提供一种顺序遍历聚合对象元素,而不暴露其内部实现的方法。
主要角色

  • Aggregate(抽象容器):负责提供创建具体迭代器角色的接口,对应于java.util.Collection接口。
  • Iterator(抽象迭代器):迭代器的抽象类,它定义遍历容器对象的操作以及返回对象的操作
  • ConcreteAggregate(具体容器):主要是可以实现内部不同的结构。但会暴露处理遍历容器的具体迭代器。
  • ConcreteIterator(具体迭代器):处理特定的具体容器类的具体迭代器,实际上对于每个容器具体容器,都必须实现一个具体的迭代器。

一、先是创建抽象容器,定义几个基本添加删除元素方法,以及迭代器

public interface Aggregate {
    // 添加元素
    void add(Object object);

    // 移除元素
    void remove(Object object);

    // 迭代器
    Iterator iterator();
}

二、创建抽象迭代器,遍历容器中的数据

public interface Iterator<E> {
    // 判断容器是否有值
    boolean hasNext();

    // 把游标执向下一个指针
    void next();

    // 当前遍历的数据
    E currentItem();
}

三、开始定义我们具体的容器了,内部定一个ArrayList容器,用来存放数据,当然这里大家也可以改成其他的容器 比如说用Vector 或者其他的 栈、树、图等

@NoArgsConstructor
@AllArgsConstructor
@Data
public class ConcreteAggregate implements Aggregate {
    private ArrayList arrayList = new ArrayList();

    @Override
    public void add(Object object) {
        this.arrayList.add(object);
    }

    @Override
    public void remove(Object object) {
        this.arrayList.remove(object);
    }

    @Override
    public Iterator iterator() {
        return new ConcreteIterator(this.arrayList);
    }
}

四、就是实现具体的迭代器了

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ConcreteIterator<T> implements Iterator<T> {


    private int cursor; // 游标
    private ArrayList arrayList;


    @Override
    public boolean hasNext() {
        return this.cursor != arrayList.size();
    }


    @Override
    public void next() {
        cursor++;
        System.out.println("cursor = " + cursor);
    }


    @Override
    public T currentItem() {
        if (cursor>=arrayList.size()){
            throw new NoSuchElementException();
        }
        T t =(T) arrayList.get(cursor);
        this.next();
        return t;
    }
}

五、迭代器测试

public class IteratorTest {
    public static void main(String[] args) {
        Aggregate aggregate = new ConcreteAggregate();
        aggregate.add("java");
        aggregate.add("c++");
        aggregate.add("php");
        aggregate.add("jsp");

        Iterator iterator = aggregate.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.currentItem());
        }
    }
}