讲师中心 微信公众号

工具推荐

视频效率加速
Seko
Seko

AI短剧一键生成成片

剧云
剧云

中文短剧剧本制作平台

AniShort
AniShort

AI短剧协同制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

Java Iterator 遍历备忘录模式怎么用

老婷君_9855

老婷君_9855

发布时间:2026-11-12 12:17:00

|

488人浏览过

|

来源于php中文网

原创

java iterator 遍历备忘录模式的核心做法是:在 originator(发起人)内部定义一个实现了 iterator 接口的私有类,将 memento(备忘录)中的状态数据暴露给该迭代器。调用者通过 getiterator() 方法获取迭代器实例,即可在不破坏封装性的前提下,按顺序访问历史状态或当前状态。

Java Iterator 遍历备忘录模式怎么用

如何设计支持迭代的备忘录结构

要实现可遍历的备忘录,关键在于将“保存状态”与“遍历状态”解耦。通常的做法是让 Memento 对象持有一个列表(如 List<state></state>),而 Originator 负责维护这个列表并生成迭代器。这样,迭代器可以直接读取备忘录中的数据,而不需要暴露具体的状态字段。

Java Iterator 遍历备忘录模式怎么用

import java.util.*;

// 1. 定义状态接口
interface State {
    String getValue();
}

// 2. 具体状态实现
class ConcreteState implements State {
    private final String value;
    public ConcreteState(String value) { this.value = value; }
    public String getValue() { return value; }
}

// 3. 备忘录:持有历史状态列表
class Memento {
    private final List<State> history;
    public Memento(List<State> history) { this.history = history; }
    public List<State> getHistory() { return new ArrayList<>(history); }
}

// 4. 发起人:包含迭代器逻辑
class Originator {
    private List<State> states = new ArrayList<>();

    // 创建备忘录
    public Memento save() {
        return new Memento(states);
    }

    // 恢复状态
    public void restore(Memento memento) {
        this.states = memento.getHistory();
    }

    // 添加新状态
    public void addState(State state) {
        states.add(state);
    }

    // 核心:返回自定义迭代器
    public Iterator<State> getIterator() {
        return states.iterator();
    }
}

上述代码展示了最基础的实现。当调用 save() 时,会将当前的 states 列表快照存入 Memento。当外部需要遍历时,直接调用 getIterator() 即可获得一个标准的 Java Iterator。这种方式保证了 Memento 的内部结构对调用者是透明的,调用者只能看到 State 对象,无法修改其内部值。

立即学习“Java免费学习笔记(深入)”;

javascript-typescript-typescript-scaffold
javascript-typescript-typescript-scaffold

你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型

下载

如何在迭代过程中处理状态快照

在实际使用中,往往需要在遍历历史状态的同时,确保每个状态都是独立的快照,避免引用共享导致的数据污染。如果在 Memento 中直接返回原始列表的迭代器,且状态对象是可变的,那么遍历过程中的任何修改都会影响原始数据。因此,必须在 Memento 构建时进行深拷贝,或者在迭代器层面提供只读视图。

Java Iterator 遍历备忘录模式怎么用

// 改进版:确保状态不可变或深拷贝
class ImmutableState implements State {
    private final String value;
    public ImmutableState(String value) { this.value = value; }
    public String getValue() { return value; }
}

// 在 Originator 中使用时
public class SafeOriginator {
    private List<ImmutableState> states = new ArrayList<>();

    public Memento save() {
        // 深拷贝策略:创建新的列表和新的状态实例
        List<ImmutableState> copy = new ArrayList<>();
        for (ImmutableState s : states) {
            copy.add(new ImmutableState(s.getValue()));
        }
        return new Memento(copy);
    }

    public Iterator<State> getIterator() {
        // 返回不可变列表的迭代器,防止外部移除元素
        return Collections.unmodifiableList(states).iterator();
    }
}

通过引入不可变状态(ImmutableState)和使用 Collections.unmodifiableList,可以彻底杜绝遍历时的副作用。此时,getIterator() 返回的迭代器不仅允许遍历,还禁止了 remove() 操作,确保了内存模型的一致性。这种设计特别适用于需要回溯历史记录的场景,比如文本编辑器的撤销功能,用户可以在历史版本间穿梭查看,但不会意外篡改某个历史版本的文本内容。

基于程序中某个输入、条件或结果的具体问题

如果程序中输入的状态数量极大,例如超过百万级,直接使用 ArrayList 存储所有历史状态会导致内存溢出。此时,应改用链表结构或分页加载策略。在迭代器实现上,可以使用懒加载(Lazy Loading)方式,仅在迭代到某一步时才从磁盘或数据库加载对应的状态对象,从而将内存占用从 O(N) 降低到 O(1)。

热门AI工具

更多
UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

12437

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

9542

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

8112

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1304

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1048

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

1556

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

3269

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

20491

2023.08.03

Go-Zero零基础入门教程
Go-Zero零基础入门教程

本专题整理Go-Zero的入门知识,从框架定位、环境准备到跑通第一个API服务,讲清目录分层、配置加载、日志与中间件的基本用法,并对比Gin、Kratos的差异,帮助Go开发者建立整体认知,判断它是否适合当前项目。

0

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn