大话设计模式——24.迭代器模式(Iterator Pattern)

简介

提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部实现。(Java中使用最多的设计模式之一)

UML图
应用场景
  • Java的集合对象:Collection、List、Map、Set等都有迭代器
  • Java ArrayList的迭代器源码

示例

简单实现集合中的迭代器功能

  1. Iterator:
java 复制代码
public interface Iterator {


    /**
     * 是否有下个元素
     *
     * @return
     */
    boolean hasNext();

    /**
     * 当前元素
     *
     * @return
     */
    Object next();

    /**
     * 删除元素
     *
     * @param obj
     */
    void remove(Object obj);
}
java 复制代码
public class ListIterator implements Iterator {


    private List list;

    /**
     * 索引
     */
    private int index = 0;

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

    @Override
    public boolean hasNext() {
        return index != list.size();
    }

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

    @Override
    public void remove(Object obj) {
        list.remove(obj);
    }
}
  1. Aggregate:
java 复制代码
public interface ICollection {

    /**
     * 添加元素
     *
     * @param obj
     */
    void add(Object obj);

    /**
     * 删除元素
     *
     * @param obj
     */
    void remove(Object obj);

    /**
     * 迭代元素
     *
     * @return
     */
    Iterator iterator();
}
java 复制代码
public class ListCollection implements ICollection {

    private List list = new ArrayList();

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

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

    @Override
    public Iterator iterator() {
        return new ListIterator(list);
    }
}

3.运行

java 复制代码
public class Main {

    public static void main(String[] args) {
        ListCollection listCollection = new ListCollection();
        listCollection.add("aaaaaa");
        listCollection.add("bbbbbb");
        listCollection.add("cccccc");
        listCollection.add("dddddd");

        // 创建迭代器
        Iterator iterator = listCollection.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

总结

  • 优点

    • 可以不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据
    • 支持以不同的方式遍历一个聚合对象
  • 缺点

    • 对于比较简单的遍历如数组、有序列表,该方式实现比较繁琐
    • 在遍历的同时更改迭代器所在的集合结构会导致异常
相关推荐
莫得感情 o8 小时前
设计模式 22 · 三个冷门模式:中介者、访问者、解释器
java·设计模式
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-08-建造者模式(业务实战篇)
java·设计模式·建造者模式·架构设计·对象构建
AustinXu1 天前
从 Claude Code 到 Claude Tag,Harness Engineering 走到了组织这一层
设计模式·团队管理
剧中有戏1 天前
单例模式从入门到精通:一个数据库连接池的完整剖析
设计模式
胡萝卜术1 天前
编译期与运行期的双重防线:从 TypeScript 类型之争到 LLM 输出的自动化择优
前端·设计模式·面试
货拉拉技术1 天前
重塑 Agent 度量衡:基于 LLM-as-a-Judge 的离线评估体系与实践
算法·设计模式
KhalilRuan1 天前
设计模式小记
设计模式
卡牌RWA研究院1 天前
Relique:一张精品卡牌如何从收藏品变成可交易的链上资产?
设计模式·金融·区块链·创业创新
剧中有戏2 天前
抽象工厂模式从入门到精通:一个多云存储案例的完整剖析(修订版)
设计模式
MC皮蛋侠客2 天前
Redis 系列(八):缓存设计模式与一致性——从 Cache Aside 到防雪崩
redis·缓存·设计模式