0

0

怎样设计C++中的备忘录模式 对象状态保存与恢复实现

P粉602998670

P粉602998670

发布时间:2025-07-20 10:31:01

|

345人浏览过

|

来源于php中文网

原创

备忘录模式适用于实现c++++程序中对象状态的保存与恢复,且不破坏封装性。其主要包括三个角色:发起人(originator)负责创建和恢复备忘录;备忘录(memento)存储状态并仅允许发起人访问;管理者(caretaker)保存但不操作备忘录内容。设计时应定义清晰的备忘录类,通常为私有或嵌套于发起人类中,并根据需要扩展字段或优化内存使用。发起人类需提供生成和恢复备忘录的方法,复杂状态下应做深拷贝。管理者常使用栈或列表保存历史记录,支持撤销、重做功能,并可通过限制保存数量控制内存消耗。其他实现建议包括封装控制、性能优化、线程安全及序列化支持。

怎样设计C++中的备忘录模式 对象状态保存与恢复实现

在设计C++程序时,如果你需要实现对象状态的保存与恢复(比如实现“撤销”功能),备忘录模式是一个非常合适的解决方案。它能帮助你在不破坏对象封装性的前提下,捕获并外部化对象的内部状态。

怎样设计C++中的备忘录模式 对象状态保存与恢复实现

备忘录模式的基本结构

备忘录模式通常包括三个角色:

怎样设计C++中的备忘录模式 对象状态保存与恢复实现
  • 发起人(Originator):负责创建一个备忘录来存储它的内部状态,并可以使用备忘录恢复状态。
  • 备忘录(Memento):用于存储发起人的状态,通常只允许发起人访问其内容。
  • 管理者(Caretaker):负责保存备忘录对象,但不能检查或操作其内容。

关键点在于保持封装性的同时,把状态存储和恢复逻辑分离出来。

立即学习C++免费学习笔记(深入)”;


定义清晰的备忘录类

备忘录类(Memento)是整个模式的核心,它应该包含足够的信息来还原发起人对象的状态。

STORYD
STORYD

帮你写出让领导满意的精美文稿

下载
怎样设计C++中的备忘录模式 对象状态保存与恢复实现
class Memento {
private:
    std::string state;
public:
    explicit Memento(const std::string& state) : state(state) {}
    std::string getState() const { return state; }
};

这个类一般会设置为私有或嵌套在发起人类中,以防止其他类直接访问其状态。

  • 可以根据实际需求扩展成更复杂的结构,比如保存多个字段、时间戳等。
  • 如果状态数据较大,可以考虑使用智能指针或共享资源管理方式来优化内存使用。

发起人类的设计要点

发起人类需要能够生成备忘录,并从备忘录中恢复状态。

class Originator {
private:
    std::string state;
public:
    void setState(const std::string& state) { this->state = state; }
    std::string getState() const { return state; }

    Memento saveToMemento() const {
        return Memento(state);
    }

    void restoreFromMemento(const Memento& memento) {
        state = memento.getState();
    }
};
  • 注意 saveToMemento()restoreFromMemento() 的设计要简单明了。
  • 如果状态复杂,可以在恢复时做深拷贝,避免引用问题。

管理者如何安全地保存历史记录

管理者的作用是保存一系列备忘录对象,以便后续恢复。

class Caretaker {
private:
    std::vector history;
public:
    void addMemento(const Memento& memento) {
        history.push_back(memento);
    }

    Memento getMemento(int index) const {
        return history[index];
    }
};
  • 常见用法是配合栈或列表结构来支持“撤销”、“重做”等功能。
  • 为了节省内存,可以限制最大保存数量,或者定期清理旧状态。

例如:

  • 撤销最近一次操作:取出最后一个备忘录进行恢复
  • 支持多级撤销:维护一个索引指向当前状态位置
  • 自动保存快照:每隔一定操作次数保存一次状态

实现细节上的几点建议

  1. 封装控制:可以把 Memento 类设为 Originator 的私有嵌套类,这样外部无法直接构造或修改它。
  2. 性能优化:如果对象状态很大,不要每次都完整保存,可以采用差异保存或压缩机制。
  3. 线程安全:在并发环境中使用时,注意对 Caretaker 的访问加锁保护。
  4. 序列化支持:如果你想持久化保存状态,可以让 Memento 支持序列化/反序列化接口。

基本上就这些。只要结构清晰,实现起来并不复杂,但在大型项目中容易被忽略的是状态一致性管理和内存开销控制。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

989

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

50

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

213

2025.12.29

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

367

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

561

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

471

2023.08.10

PHP 高并发与性能优化
PHP 高并发与性能优化

本专题聚焦 PHP 在高并发场景下的性能优化与系统调优,内容涵盖 Nginx 与 PHP-FPM 优化、Opcode 缓存、Redis/Memcached 应用、异步任务队列、数据库优化、代码性能分析与瓶颈排查。通过实战案例(如高并发接口优化、缓存系统设计、秒杀活动实现),帮助学习者掌握 构建高性能PHP后端系统的核心能力。

95

2025.10.16

PHP 数据库操作与性能优化
PHP 数据库操作与性能优化

本专题聚焦于PHP在数据库开发中的核心应用,详细讲解PDO与MySQLi的使用方法、预处理语句、事务控制与安全防注入策略。同时深入分析SQL查询优化、索引设计、慢查询排查等性能提升手段。通过实战案例帮助开发者构建高效、安全、可扩展的PHP数据库应用系统。

70

2025.11.13

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 5.7万人学习

C 教程
C 教程

共75课时 | 3.8万人学习

C++教程
C++教程

共115课时 | 10.6万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号