设计模式: 行为型之备忘录模式(13)

Java之美[从菜鸟到高手演变]之设计模式三 本章是关于设计模式的最后一讲,会讲到第三种设计模式——行为型模式,共11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。这段时间一直在写关于设计模式的东西,终于写到一半了,写博文是个很费时间的东西,因为我得为读者负责,不论是图还是代码还是表述,都希望能尽量写清楚,以便读者理解,我想不论是我还是读者,都希望看到高质量 阅读详情

备忘录模式概述

  • 备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不破坏封装性的前提下捕获一个对象的内部状态,并在对象之外保存这个状态
  • 这样以后就可将该对象恢复到原先保存的状态。这种类型的设计模式属于行为模式
  • 在备忘录模式中,主要涉及三种角色:
    • 发起人(Originator)角色
      • 记录当前时刻它的内部状态,并可使用备忘录恢复内部状态
      • 发起人可以根据需要决定备忘录存储发起人的哪些状态
    • 备忘录(Memento)角色
      • 负责存储发起人对象的内部状态,并可防止发起人以外的其他对象访问备忘录
      • 备忘录有两个接口,一是提供它所能保存的发起人内部状态,二是将这些状态恢复到发起人对象中
    • 管理者(Caretaker)角色
      • 负责保存好备忘录,不能对备忘录的内容进行操作或检查

备忘录模式应用

// 原始类(Originator)定义
class Originator {
  private state: string; // 内部状态

  constructor(state: string) {
    this.state = state;
  }

  // 创建备忘录方法,返回备忘录对象
  createMemento(): Memento {
    return new ConcreteMemento(this.state);
  }

  // 设置内部状态方法,可以通过备忘录恢复状态
  setMemento(memento: Memento) {
    this.state = memento.getState();
  }

  // 其他业务逻辑,改变内部状态
  setState(newState: string) {
    this.state = newState;
    console.log(`State changed to: ${this.state}`);
  }

  // 获取当前状态
  getState(): string {
    return this.state;
  }
}

// 备忘录接口和实现
interface Memento {
  getState(): string;
}

class ConcreteMemento implements Memento {
  private _state: string;

  constructor(state: string) {
    this._state = state;
  }

  getState(): string {
    return this._state;
  }
}

// 管理者角色(Caretaker)负责保管备忘录,但不关心备忘录的具体内容
class Caretaker {
  private _mementos: Memento[] = [];

  // 添加备忘录
  addMemento(memento: Memento) {
    this._mementos.push(memento);
  }

  // 获取备忘录,通常由原始类调用
  getMemento(index: number): Memento | undefined {
    return this._mementos[index];
  }
}

// 示例用法
const originator = new Originator("Initial State");
console.log("Original state:", originator.getState());

// 创建一个备忘录并保存状态
const caretaker = new Caretaker();
caretaker.addMemento(originator.createMemento());

// 改变原始类的状态
originator.setState("New State");
console.log("Changed state:", originator.getState());

// 通过备忘录恢复状态
if (caretaker.getMemento(0)) {
  originator.setMemento(caretaker.getMemento(0)!);
  console.log("Restored state:", originator.getState());
}
  • 在这个例子中:Originator 类代表了一个包含内部状态的对象,它定义了如何创建 (createMemento) 和恢复 (setMemento) 备忘录。
  • Memento 是一个接口,代表备忘录对象,它包含了对内部状态的引用,但对外部世界隐藏了这些状态的具体内容。ConcreteMemento 类实现了这个接口,存储了实际的状态值。
  • Caretaker 类扮演管理者角色,它可以接收备忘录并存储它们,但它并不知道如何解读备忘录的内容。当需要时,它把备忘录交还给 Originator 进行状态恢复。
  • 通过这种模式,我们可以安全地保存和恢复 Originator 的内部状态,同时保持了良好的封装性

备忘录模式的优缺点


1 )优点

  • 它提供了一种可以撤销操作的机制
  • 封装了内部状态,并通过对外部提供的接口来恢复内部状态

2 ) 缺点

  • 如果发起人状态很大或者很多,那么存储起来可能会消耗很大的内存
  • 可能会存在很多备忘录对象,消耗内存
  • 在实际应用中,备忘录模式通常用于实现诸如“撤销”这样的功能,例如文本编辑器中的撤销操作
  • 通过保存用户每次编辑操作的状态,可以方便地撤销到之前的状态
C++设计模式18:备忘录模式 备忘录模式(Memento Pattern)是一种行为型设计模式,它允许你捕获对象的内部状态,并在需要时恢复该状态,而无需暴露该对象的实现细节。当需要保存一个对象的某个状态时,我们可以使用备忘录模式。例如,当需要撤销某个操作时,可以使用备忘录模式将当前的状态保存在备忘录中,以便在需要时恢复该状态。备忘录模式还可以用于实现事务性操作,以及在多级撤销系统中维护对象状态。 阅读详情

相关推荐

VSCode配置C/C++开发环境:从零安装MinGW-w64并运行第一个C程序

在Windows系统上搭建C语言开发环境时,很多初学者混淆编辑器、编译器与调试器的分工,导致配置过程屡屡受挫。理解VSCode作为轻量级编辑器的定位,以及MinGW-w64提供的gcc编译器在源码编译中的核心作用,是顺利完成环境配置的关键。环境变量的正确设置直接影响gcc命令能否全局调用,而C/C++插件则赋予编辑器语法高亮与智能提示能力。通过安装VSCode、配置MinGW-w64、安装插件、汉化界面并运行一个最简单的hello.c程序,就能系统掌握这套开源工具链的完整工作流。无论是用于课程学习、算法练习

weixin_42531923的博客 534

c++ 行为型_备忘录模式(Memento)

行为型_备忘录模式(Memento) 作用场景: 当意图在对象外面保存对象的内部状态,但是又不想破坏对象的封装性,就可以考虑备忘录模式。 解释: 其参与者包括 1、Memnto(备忘录,如下列CountMemento ) 2、Originator(原发器,如下列Counter ), 3、Caretaker(管理者,如下列CounterCaretaker ) Memnto用...

aiaw26678的博客 138

envi反演水质参数_遥感水质反演之反演模型

水质反演的框架图此为反演模型的章节第一部分,统计学基础:概率论、矩阵和数理统计的知识统计学知识框架# 1 基本统计概念知识在于应用,而非记忆!我们都是在样本的层面去操作数据的,以达到对总体性质的估计和推断,拿到一组数据首先进行基本的统计描述,常用的有:样本均值: 样本方差(调整方差)不是除以n,而是n-1, 标准差为样本方差开方即可皮尔逊积矩相关系数(简称相关系数): 相关系数范围在[-1,...

weixin_35275922的博客 3229

java 设计模式_行为型_13备忘录模式

备忘录模式是一种行为型设计模式,在不破坏封装性的前提下保存对象状态,以便后续恢复。该模式包含三个核心角色:发起人(保存和恢复状态)、备忘录(存储状态)、管理者(维护备忘录)。通过示例代码展示了游戏关卡状态的保存和回退功能,其中发起人创建状态快照存入备忘录,管理者负责存储这些快照,需要时可将状态恢复到之前的任意保存点。这种模式适用于需要撤销/重做、状态回退等场景,为系统提供灵活的"后悔机制"。

qq_39275653的博客 396

stackelberg博弈_博弈论、多智能体、强化学习(随便记点东西)

多智能体应用场景:已实现:游戏AI。正在努力:UAV,物资运输,快递分发,交通系统。未来:社会学,预测群体行为,城市区域合作,国际关系。博弈论基本定义:玩家集合: 策略集合: 收益函数: 囚徒困境:两智能体矩阵博弈坦白抵赖坦白1,13,0抵赖0,32,2占优策略与最佳应对:上表中两者均具有占优策略,即无论如何都应该选坦白。那么构造下表。坦白抵赖坦白1,13,0抵赖0,12,2对于玩家一来说,坦白...

weixin_39611722的博客 3000

Saturn PCB Toolkit V8.02 实战:5分钟完成10A电源路径的走线与过孔通流验证

本文详细介绍了如何使用Saturn PCB Toolkit V8.02快速验证10A电源路径的走线与过孔通流能力。通过实战案例和参数配置指南,帮助工程师解决大电流PCB设计中的温升失控、过孔瓶颈等核心挑战,提升设计效率和可靠性。

weixin_34194829的博客 452

设计模式实战精讲:行为型模式

本篇博客包含11种设计模式,自从学习这么多种设计模式后,我的心态也发生了变化,或许不会存在永远按照设计模式来设计的程序,一个项目也可能存在符合多种设计模式的情况,但是无论正确与否,我觉得可读性强的,利于维护的,方便增加功能的项目就是好项目。(例如有三个对象,调用顺序是A->B->C,把所有的项目都先传递给A,A拿到所有的项目后,把属于自己负责的项目留下来,把剩下的传递给B,然后B把属于自己的留下来,把不属于自己的再传递给C)1.定义抽象元素类:定义访问者可调用的函数,访问者通过该函数实现修改元素内的内容。

WildPointer的博客 1156

注意力机制详解

注意力机制详解Attention机制由来Attention定义Encoder-Decoder框架存在问题:Attenion机制的引入Attention机制的类别Hard AttentionSoft AttentionGlobal AttentionLocal AttentionSelf AttentionMulti-head Attention附录—Transformer全局视角Tensor视角Encoder部分Self-AttentionSelf-Attention向量计算Self-Attention的矩

weixin_43236310的博客 1万+

备忘录模式(Memento Pattern)详解

备忘录模式是一种行为型设计模式,它允许在不破坏对象封装性的前提下,捕获对象的内部状态,并在需要时将对象恢复到这个状态。简单来说,备忘录模式就是用来实现"撤销"和"恢复"功能的一种设计模式。备忘录模式使得程序可以回到某个历史状态,就像"时间旅行"一样,让我们能够重返过去的某个时间点。备忘录模式是一种行为型设计模式,它允许在不破坏对象封装性的前提下,捕获对象的内部状态,并在需要时将对象恢复到这个状态。

yk_dflkg的博客 1575

【项目实战】Qt6 录制屏幕、录制声音生成MP4、AVI、MA3等(完整源码,可直接编译使用)

本文将详细介绍如何利用Qt6多媒体模块中的QMediaCaptureSession、QMediaRecorder、QScreenCapture、QAudioInput、QMediaFormat等功能,实现对屏幕和声音的录制,并生成常见的媒体格式文件,如MP4、AVI、MA3等。我们将探讨如何利用这些功能来实现灵活的视频和音频参数设置,以满足不同需求下的录制和生成要求。我们将重点讨论如何配置视频和音频参数,包括分辨率、帧率、编解码器选择、音频采样率、声道设置等。

yegu001的博客 4940

华为OD机试 - 幸运数字(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题。

学Java,找哪吒 3777

D23:C#设计模式之二十二备忘录模式(Memento Pattern)【行为型】

一、引言 今天我们开始讲“行为型”设计模式的第十个模式,该模式是【备忘录模式】,英文名称是:Memento Pattern。按老规矩,先从名称上来看看这个模式,个人的最初理解就是对某个对象的状态进行保存,等到需要恢复的时候,可以从备忘录中进行恢复。生活中这样的例子也能经常看到,如备份电话通讯录,备份操作操作系统,备份数据库等。如果我们想恢复对象的状态,那么我们可能首先想到的是把对象保存下来,...

. 633

流体动力学仿真软件:Star-CCM+_(15).用户自定义函数与模型

用户自定义函数(User-Defined Functions, UDFs)允许用户编写自己的函数,并在仿真中调用这些函数。UDFs可以用于定义复杂的边界条件、源项、材料属性等。Star-CCM+支持多种编程语言,包括C++、Fortran和Java等,其中最常用的语言是Java。用户自定义模型(User-Defined Models, UDMs)允许用户在仿真中引入自定义的物理模型。这些模型可以用于描述流体行为、化学反应、多相流等复杂现象。Star-CCM+提供了丰富的API来支持UDMs的开发。

kkchenjj的博客 557

Java中13种设计模式汇总

设计模式(Design Patterns)                                   ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化

u010278862的专栏 5138

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

设计模式-13-观察者模式(上)-行为型模式

我们常把23种经典的设计模式分为三类:创建型、结构型、行为型。前面我们已经学习了创建型和结构型,从今天起,我们开始学习行为型设计模式。我们知道,创建型设计模式主要解决“对象的创建”问题,结构型设计模式主要解决“类或对象的组合或组装”问题,那行为型设计模式主要解决的就是“类或对象之间的交互”问题。行为型设计模式比较多,有11个,几乎占了23种经典设计模式的一半。它们分别是:观察者模式、模板模式、策略模式、职责链模式、状态模式、迭代器模式、访问者模式、备忘录模式、命令模式、解释器模式、中介模式。

helloworld_9的博客 649

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

设计模式-1.12备忘录模式

1.定义: 备忘录模式:Memento,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态[DP]。 2.分类:行为型模式 3.UML 4.实例:举个简单的例子,我们玩游戏时都会保存进度,所保存的进度以文件的形式存在。这样下次就可以继续玩,而不用从头开始。这里的进度其实就是游戏的内部状态,而这里的文件相当于...

144

JAVA SCRIPT设计模式--行为型--设计模式之Memnto备忘录模式(18)

一个备忘录(memento)是一个对象,它存储另一个对象在某个瞬间的内部状态,而后者称为备忘录的原发器(originator)。但是对象通常封装了其部分或所有的状态信息 , 使得其状态不能被其他对象访问,也就不可能在该对象之外保存其状态。4)根据SolverState备忘录中的信息,ConstraintSolver改变它的内部结构以精确地将它的等式和变量返回到它们各自先前的状态。这一方案允许ConstraintSolver把恢复先前状态所需的信息交给其他的对象,而又不暴露它的内部结构和表示。

火柴盒 400

每天记录学习的新知识 :Android 设计模式之行为型

文章目录前言创建型行为型结构型行为型设计模式学习6. 策略模式7. 状态模式8. 观察者模式9. 中介者模式10. 访问者模式11. 迭代器模式12. 模板方法13. 备忘录模式14. 命令模式15. 解释器模式16. 职责链模式 前言 Android 的设计模式分为3大类,一个23种。 创建型 单例模式; 2. Builder模式; 3. 原型模式; 4. 工厂方法; 5. 抽象工厂 行为型 策略模式; 7. 状态模式; 8. 观察者模式; 9. 中介者模式; 10.

嗯... 471

设计模式(六)--备忘录模式

c深色版本3// 存储状态6} Memento;78// 创建备忘录13}1415// 释放备忘录18}备忘录模式通过存储和恢复对象的状态,使得对象可以在不同状态之间切换,而无需破坏封装性。这种模式非常适合用于实现撤销功能或需要保存多个状态的历史记录。在使用备忘录模式时,需要注意合理管理内存,避免不必要的内存消耗。

MHD0815的博客 644

设计模式之备忘录模式

备忘录模式(Memento Pattern)是一种行为型设计模式,用于捕获一个对象的内部状态,并在该对象之外保存这个状态,以便在需要时能够将对象恢复到先前保存的状态。2. 备忘录(Memento):存储原发器的内部状态,备忘录对象应该被设计为原发器的私有内部类,以确保其状态的封装性和安全性。1. 原发器(Originator):创建并使用备忘录来保存其内部状态,原发器可以根据需要决定保存哪些内部状态。1. 保持了原发器对象的封装性,负责人只能看到备忘录的窄接口,无法访问原发器的内部状态细节。

alankuo的专栏 409

创建型模式、结构型模式和行为型模式_行为型模式(六):备忘录模式

一、模式的定义与特点备忘录(Memento)模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。备忘录模式是一种对象行为型模式,优点:1、提供了一种可以恢复状态的机制。当用户需要时能够比较方便地将数据恢复到某个历史的状态。2、实现了内部状态的封装。除了创建它的发起人之外,其他对象都不能够访问...

weixin_39799561的博客 107

【设计模式】五、UML建模:行为型模式

12责任链模式 UML类图引用: 13命令模式 UML类图引用: 14解释器模式 UML类图引用: 15迭代器模式 UML类图引用: 16中介者模式 UML类图引用: 17备忘录模式 记录对象信息方法。工具类图: UML类图引用: 18观察者模式 UML类图引用: 19状态模式 UML类图引用: 20...

qqchaozai的专栏 1618

设计模式(13)备忘录模式

1 备忘录模式属于行为型模式。它保存一个对象的某个状态,以便在适当的时候恢复对象。有点像我们常说的“后悔药”。@2 4W1H 模型解读备忘录模式@3 备忘录模式优缺点消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。@4 备忘录模式UML图。

wangdsh的博客 418

备忘录模式详解附有代码案例分析

备忘录模式一、备忘录模式的概念与角色(一)、备忘录模式的概念(二)、备忘录模式的角色二、 备忘录模式的应用场景三、备忘录模式的代码示例四、备忘录模式的优缺点(一)、优点(二)、缺点 一、备忘录模式的概念与角色 (一)、备忘录模式的概念 ​ 备忘录模式又称为快照模式,是指在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态,属于行为型模式。 ​ 备忘录模式本质是从发起人实体类隔离存储功能,降低实体类的职责。同时由于存储信息独立,且存储信息的实体

hyyyya的博客 886

202515 | 设计模式13 | 访问者模式 | 备忘录模式 | 访问者模式

捕获对象的当前状态,并在未来需要时恢复到这个状态**,同时确保对象的封装性不被破坏。定义一种语言的语法表示,并提供一个解释器来解析和执行该语言的语法**。,允许在不修改数据结构的前提下,增加新操作。负责定义一系列的操作,而数据结构(元素对象)(如 IDE、Office 文档) ✅。:数学计算、规则解析、DSL 设计等。:文本编辑、游戏存档、事务回滚等。(如编译器、XML 解析) ✅。:编译器、文件系统、数据分析等。将数据结构与操作解耦**,使得。(如文件系统遍历) ✅。

weixin_43422022的博客 1030

简说设计模式——备忘录模式

一、什么是备忘录模式   备忘录这个词汇大家应该都不陌生,我就经常使用备忘录来记录一些比较重要的或者容易遗忘的信息,与之相关的最常见的应用有许多,比如游戏存档,我们玩游戏的时候肯定有存档功能,旨在下一次登录游戏时可以从上次退出的地方继续游戏,或者对复活点进行存档,如果挂掉了则可以读取复活点的存档信息重新开始。与之相类似的就是数据库的事务回滚,或者重做日志redo log等。   备忘录模式(Memento),在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存着这个状态。这样以后就可将该对象.

399
上一篇: 设计模式: 结构型之装饰器模式(12)
下一篇: 设计模式: 行为型之责任链模式(14)
Wang's Blog
博客等级 码龄12年 7434粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值