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. 总结

相关推荐
tgethe20 小时前
java并发——1
java·开发语言·面试
coder_zh_20 小时前
Java基础-学习-面试-校招-要点突击检查
java
郑州光合科技余经理20 小时前
海外O2O系统源码剖析:多语言、多货币架构设计与二次开发实践
java·开发语言·前端·小程序·系统架构·uni-app·php
工程师老罗1 天前
Image(图像)的用法
java·前端·javascript
leo_messi941 天前
2026版商城项目(一)
java·elasticsearch·k8s·springcloud
美味蛋炒饭.1 天前
Tomcat 超详细入门教程(安装 + 目录 + 配置 + 部署 + 排错)
java·tomcat
dreamxian1 天前
苍穹外卖day11
java·spring boot·后端·spring·mybatis
Veggie261 天前
【Java深度学习】PyTorch On Java 系列课程 第八章 17 :模型评估【AI Infra 3.0】[PyTorch Java 硕士研一课程]
java·人工智能·深度学习
weisian1511 天前
Java并发编程--19-ThreadPoolExecutor七参数详解:拒绝Executors,手动掌控线程池
java·线程池·threadpool·七大参数
csdn5659738501 天前
Java打包时,本地仓库有jar 包,Maven打包却还去远程拉取
java·maven·jar