码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 备忘录模式(Memento)


    参考:

    [备忘录设计模式 (refactoringguru.cn)](https://refactoringguru.cn/design-patterns/mediator)

     

    文章目录

      • 一、什么是备忘录模式?
      • 二、实现
      • 三、优缺点
        • 优点
        • 缺点
      • 四、适用环境

    一、什么是备忘录模式?

    在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前某个时间点的状态。如果使用一些公有接口来让其它对象得到对象的状态,便会暴露对象的细节实现。
     
    备忘录模式定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将对象恢复到原先保存的状态。
     
    例如编辑器中保存的内容,可能一些历史修改的快照,用户可以通过撤消恢复历史编辑的内容。

    在这里插入图片描述

     

    二、实现

    备忘录(Memento)模式包含以下主要角色:

    1、原发器(Originator):可以生成自身状态的快照, 也可以在需要时通过快照恢复自身状态。
    2、备忘录(Memento):用于存储Originator角色的内部状态,且可以防止Originator以外的对象进行访问。
    3、负责人(Caretaker):负责存储,管理备忘录功能。且其本身应该无法对备忘录的内容进行访问。

    在这里插入图片描述

     

    #include 
    #include 
    using namespace std;
    
    class Memento
    {
        string state;
    public:
        Memento(const string &s) : state(s) {}
        string getState() const { return state; }
        void setState(const string &s) { state = s; }
    };
    
    class Originator
    {
        string state;
    public:
        Originator() {}
        Mmento creatMemento() { return Memento(state); }
        void setMemento(const Memento &m) { state = m.getState(); }
    }
    
    int main()
    {
        Originator originator;
        Memento mem = originator.createMemento();
        // do something ...
        originator.setMemento(memento);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

     

    三、优缺点

    优点

    • 可以在不破坏对象封装情况的前提下创建对象状态快照。
    • 可以通过让负责人维护原发器状态历史记录来简化原发器代码。

    缺点

    • 如果客户端过于频繁地创建备忘录, 程序将消耗大量内存。
    • 负责人必须完整跟踪原发器的生命周期, 这样才能销毁弃用的备忘录。

     

    四、适用环境

    • 当你需要创建对象状态快照来恢复其之前的状态时, 可以使用备忘录模式。
    • 当直接访问对象的成员变量、 获取器或设置器将导致封装被突破时,可以使用该模式。
  • 相关阅读:
    LogBack的日志报错解决办法 org.xml.sax.SAXNotRecognizedException
    域对象共享数据
    qt获取cmd系统指令返回值的三种方法,支持windows和linux
    OkHttp 根据服务器返回的的过期时间设置缓存
    无胁科技-TVD每日漏洞情报-2022-11-15
    【Verilog】时序逻辑电路 -- 有限同步状态机[补充]
    电商收付通,多服务商模式
    汇编语言中断及外部设备操作篇--06
    路径操作 合法路径名
    【Java项目】销售评价系统
  • 原文地址:https://blog.csdn.net/I_just_smile/article/details/128211916
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号