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

相关推荐
微信api接口介绍几秒前
微信社群管理开发
java·开发语言·网络·微信
「QT(C++)开发工程师」1 小时前
C++语言编程规范-并发
java·linux·c++
Meteors.1 小时前
23种设计模式——迭代器模式 (Iterator Pattern)详解
java·设计模式·迭代器模式
自由的疯1 小时前
Java Jenkins+Docker部署jar包
java·后端·架构
自由的疯1 小时前
Java Jenkins、Dockers和Kubernetes有什么区别
java·后端·架构
友莘居士1 小时前
Java基于Web3j调用智能智能合约案例
java·web3·智能合约
哲此一生9841 小时前
SpringBoot3集成Mybatis(开启第一个集成Mybatis的后端接口)
java·spring boot·mybatis
浮游本尊2 小时前
Java学习第26天 - 微服务监控与运维实践
java
高山上有一只小老虎2 小时前
idea2025社区版设置打开的多个文件展示在工具栏下方
java·ide·intellij-idea
凸头2 小时前
责任链模式
java·开发语言·责任链模式