23种设计模式之迭代器模式

目录

  • [1. 简介](#1. 简介)
  • [2. 代码](#2. 代码)
    • [2.1 Iterator (迭代器接口)](#2.1 Iterator (迭代器接口))
    • [2.2 Container (聚合对象接口)](#2.2 Container (聚合对象接口))
    • [2.3 NameContainer(具体迭代器+具体聚合对象)](#2.3 NameContainer(具体迭代器+具体聚合对象))
    • [2.4 Test(测试)](#2.4 Test(测试))
    • [2.5 运行结果](#2.5 运行结果)
  • [3. 使用场景](#3. 使用场景)
  • [4. 优缺点](#4. 优缺点)
  • [5. 总结](#5. 总结)

1. 简介

迭代器模式(Iterator Pattern) 是一种行为设计模式。它提供了一种方法来顺序访问一个聚合对象(如数组、列表、树等各种集合类型)中的各个元素,而又不暴露该对象的内部表示。

简单来说,就像是给一个装满东西的盒子(聚合对象)配备了一个工具(迭代器),通过这个工具可以逐个拿出盒子里的东西,并且不需要知道盒子内部是怎么摆放这些东西的。

结构组成

  • 迭代器(Iterator)接口
    定义了访问和遍历元素的接口,通常包括hasNext()和next()等方法。hasNext()用于判断是否还有下一个元素,next()用于返回下一个元素。
  • 具体迭代器(Concrete Iterator)
    实现迭代器接口,负责具体的遍历算法。它要记录当前遍历的位置等状态信息。
  • 聚合对象(Aggregate)接口
    定义了创建迭代器的接口方法,通常是createIterator()之类的方法。它表示可以被遍历的对象集合。
  • 具体聚合对象(Concrete Aggregate)
    实现聚合对象接口,它包含了实际的元素集合,并实现创建迭代器的方法,返回一个具体的迭代器对象。

2. 代码

2.1 Iterator (迭代器接口)

java 复制代码
public interface Iterator {
    public boolean hasNext();
    public Object next();
}

2.2 Container (聚合对象接口)

java 复制代码
public interface Container {
    public Iterator getIterator();
}

2.3 NameContainer(具体迭代器+具体聚合对象)

java 复制代码
public class NameContainer implements Container{
    public String names[]={"Ram","Shyam","Mohan"};
    @Override
    public Iterator getIterator() {
        return new NameIterator();
    }

    private class NameIterator implements Iterator{
        int index;
        @Override
        public boolean hasNext() {
            return index<names.length;
        }

        @Override
        public Object next() {
            return names[index++];
        }
    }
}

2.4 Test(测试)

java 复制代码
public class Test {
    public static void main(String[] args) {
        NameContainer nameContainer = new NameContainer();
        Iterator iterator = nameContainer.getIterator();
        while (iterator.hasNext())
        {
            System.out.println(iterator.next());
        }
    }
}

2.5 运行结果

复制代码
Ram
Shyam
Mohan

3. 使用场景

  • 访问聚合对象的内容而不暴露其内部结构
    比如,在一个复杂的图形绘制系统中,有一个图形集合(可能包括圆形、矩形等多种图形)。通过迭代器模式,可以方便地遍历这个图形集合来进行绘制操作,而不用关心图形集合内部是如何存储这些图形的(是用数组、链表还是其他数据结构)。
  • 支持多种遍历方式
    对于一个二叉树结构的数据集合,可以实现不同的迭代器来进行前序遍历、中序遍历、后序遍历等。这样在需要不同遍历顺序的场景下(如查找特定节点、计算树的高度等),可以灵活地使用不同的迭代器。

4. 优缺点

  • 优点
    • 分离了聚合对象的遍历行为和存储结构
      使得聚合对象的内部结构可以自由变化,而只要迭代器接口不变,外部使用迭代器的代码就不需要修改。例如,将一个数组存储的集合改为链表存储,只要更新具体聚合对象中的创建迭代器方法,让它返回适合链表遍历的迭代器即可,其他使用迭代器的部分代码不受影响。
    • 单一职责原则的体现
      迭代器专注于遍历元素,聚合对象专注于存储元素,使得每个类的职责更加清晰。这样代码的可维护性和可扩展性都得到了提高。
  • 缺点
    • 增加了类的数量
      因为需要定义迭代器接口、具体迭代器、聚合对象接口和具体聚合对象等多个类,对于简单的应用场景可能会显得有些繁琐。
    • 遍历过程可能比较复杂时,实现迭代器的代码会变得复杂
      例如,对于一个具有复杂嵌套结构的集合(如多层嵌套的树形结构),实现一个能够正确遍历所有元素的迭代器可能会涉及到较多的递归或者状态维护代码。

5. 总结

相关推荐
带刺的坐椅2 分钟前
Solon AI 开发学习16 - generate - 生成模型(图、音、视)
java·ai·llm·openai·solon
jiayong236 分钟前
Spring Bean 生命周期详解
java·后端·spring
卿雪10 分钟前
缓存异常:缓存击穿、缓存穿透、缓存雪崩 及其解决方案
java·数据库·redis·python·mysql·缓存·golang
小坏讲微服务17 分钟前
Spring Boot 4.0 整合 RabbitMQ 注解方式使用指南
java·spring boot·rabbitmq·java-rabbitmq
星辰烈龙18 分钟前
黑马程序员Java基础7
java·开发语言
big-seal19 分钟前
分页列表中能够按照名称查询,使用 mybatis 的 Example 动态构造 SQL where 条件
java·开发语言
福尔摩斯张19 分钟前
C语言文件操作详解(一):文件的打开与关闭(详细)
java·linux·运维·服务器·c语言·数据结构·算法
廋到被风吹走21 分钟前
【Spring】依赖注入的实现方式对比
java·spring
Zzzzzxl_23 分钟前
互联网大厂Java/Agent面试实战:Spring Boot、JVM、微服务与AI Agent/RAG场景问答
java·jvm·spring boot·ai·agent·rag·microservices
未若君雅裁24 分钟前
JVM高级篇总结笔记
java·jvm·笔记