备忘录模式(Memento)

news/2024/11/7 22:37:48/

参考:

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

文章目录

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

一、什么是备忘录模式?

在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前某个时间点的状态。如果使用一些公有接口来让其它对象得到对象的状态,便会暴露对象的细节实现。

备忘录模式定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将对象恢复到原先保存的状态。

例如编辑器中保存的内容,可能一些历史修改的快照,用户可以通过撤消恢复历史编辑的内容。

在这里插入图片描述

二、实现

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

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

在这里插入图片描述

#include <iostream>
#include <string>
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);
}

三、优缺点

优点

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

缺点

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

四、适用环境

  • 当你需要创建对象状态快照来恢复其之前的状态时, 可以使用备忘录模式。
  • 当直接访问对象的成员变量、 获取器或设置器将导致封装被突破时,可以使用该模式。

http://www.ppmy.cn/news/2118.html

相关文章

【JavaWeb】第七章 Tomcat

文章目录1、JavaWeb2、Web资源与Web服务器3、Tomcat的使用4、部署Web工程到Tomcat中5、工程和资源的访问6、IDEA集成Tomcat服务器7、创建动态web工程8、在IDEA中启动部署web模块1、JavaWeb JavaWeb是指通过Java语言编写的可以通过浏览器访问的程序的总称。 请求&#xff1a; 客…

Python.03.函数使用

目录 函数与方法的区别 函数的定义 传参的情况 常见传参 其他传参 函数的返回值 函数嵌套 Lambda表达式 字典排序 map函数 filter函数 函数与方法的区别 直接调用的是函数 &#xff0c;通过对象点出来的是方法 print("hello") a [2, 1, 3] a.sort() pri…

C++ lambda表达式详解

一、lambda表达式基本用法 1、语法 Lambda 表达式的基本语法如下&#xff1a; 捕获列表 mutable(可选) 异常属性 -> 返回类型 { // 函数体 } 2、lambda值捕获 /*** brief lamdba值捕获*/ void test() {int nvalue 1;auto func_copyvalue [nvalue]{return nvalue;};nva…

SpringBoot —— 整合RabbitMQ常见问题及解决方案

前言 企业中最常用的消息中间件既不是RocketMQ&#xff0c;也不是Kafka&#xff0c;而是RabbitMQ。 RocketMQ很强大&#xff0c;但主要是阿里推广自己的云产品而开源出来的一款消息队列&#xff0c;其实中小企业用RocketMQ的没有想象中那么多。 至于Kafka&#xff0c;主要还是…

python 图形界面“诈金花”游戏,更新了!附完整代码

旧版本的代码请见上一篇博文&#xff1a; python 从一道作业题到制作一个图形界面的“诈金花”游戏_Hann Yang的博客-CSDN博客Player1: (♥Q, ♣2, ♣8) - 单张Player2: (♦10, ♥7, ♠6) - 单张Player3: (♣4, ♠4, ♦2) - 对子Player4: (♠5, ♠9, ♥6) - 单张Player5: (♠…

多数之和问题

文章目录多数求和问题1两数之和(无序)题解2两数之和(有序)题解3两数之和(二叉搜索树)题解4 三数之和题解5四数之和题解多数求和问题 针对给一组用例,和一个目标数target,求用例中多数相加等于target的所有数,且不能重复问题,一般有两种解法: 集合(不要求排序)双指针(要求排序…

springboot基于Java的电影院售票与管理系统毕业设计源码011449

电影院售票与管理系统的设计与实现 摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对电影院售…

JVM—双亲委派

文章目录什么是双亲委派&#xff1f;为什么要有双亲委派原理&#xff1f;破坏双亲委派的例子————————————————————————————————什么是双亲委派&#xff1f; ​ 就是我们写的java源文件到最终运行&#xff0c;必须要经过编译和类加载这两个阶段…