详解设计模式:备忘录模式

article/2025/11/10 19:00:12

详解设计模式:备忘录模式

备忘录模式(Memento Pattern)也被称为快照模式(Snapshot Pattern)、Token 模式(Token Pattern),是在 GoF 23 种设计模式中定义了的行为型模式。

备忘录模式 会保存一个对象的某个状态,以便在适当的时候恢复对象。

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

本篇文章内容包括:关于备忘录模式、备忘录模式 Demo(伪代码)


文章目录

  • 详解设计模式:备忘录模式
    • 一、关于备忘录模式
        • 1、关于备忘录模式
        • 2、关于备忘录模式的构成
        • 3、关于备忘录模式的UML
        • 4、关于备忘录模式的适用场景
        • 5、关于备忘录模式的优缺点
    • 二、备忘录模式 Demo(伪代码)
        • 1、伪代码 Demo 实现
        • 2、Demo 测试


一、关于备忘录模式

1、关于备忘录模式

备忘录模式(Memento Pattern)也被称为快照模式(Snapshot Pattern)、Token 模式(Token Pattern),是在 GoF 23 种设计模式中定义了的行为型模式。

备忘录模式 会保存一个对象的某个状态,以便在适当的时候恢复对象。

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

2、关于备忘录模式的构成

备忘录模式主要包含以下 3 种角色:

  • 发起人角色(Originator):负责创建一个备忘录,记录自身需要保存的状态,具备状态回滚功能
  • 备忘录角色(Memento):用于存储 Originator 的内部状态,可以防止 Originator 以外的对象访问
  • 备忘录管理员角色(Caretaker):负责存储。提供管理员备忘录,无法对备忘录内容进行操作和访问

3、关于备忘录模式的UML

在这里插入图片描述

4、关于备忘录模式的适用场景

  • 撤销操作 : 保存 / 恢复 数据 的相关业务场景 ; 如 : 在 Word 中编写文档 , 如果想要撤销之前的 输入 / 删除操作 , 使用 Ctrl + Z 执行 " 撤销 " 操作 ;
  • 状态恢复 : 在 " 后悔 " 的时候 , 将对象恢复到之前的状态 ; 如 : 游戏中的存档使用 。

5、关于备忘录模式的优缺点

# 备忘录模式的优点

  • 有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取,这时,使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界。
  • 本模式简化了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需要的这些状态的版本。
  • 当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。

# 备忘录模式的缺点:

  • 如果发起人角色的状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象会很昂贵。
  • 当负责人角色将一个备忘录 存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否很昂贵。
  • 当发起人角色的状态改变的时候,有可能这个协议无效。如果状态改变的成功率不高的话,不如采取“假如”协议模式。

二、备忘录模式 Demo(伪代码)

1、伪代码 Demo 实现

# Originator 发起人角色

public class Originator {/*** 内部状态*/private String state;public String getState() {return this.state;}public void setState(String state) {this.state = state;}/*** 创建一个备忘录* @return Memento*/public Memento createMemento() {return new Memento(this.state);}/*** 从备忘录恢复* @param memento Memento*/public void restoreMemento(Memento memento) {this.setState(memento.getState());}
}

# Memento 备忘录角色

public class Memento {private String state;public Memento(String state){this.state = state;}public String getState() {return this.state;}public void setState(String state) {this.state = state;}
}

# Caretaker 备忘录管理员角色

public class Caretaker {/*** 备忘录对象*/private Memento memento;public Memento getMemento() {return this.memento;}public void storeMemento(Memento memento) {this.memento = memento;}
}

2、Demo 测试

public class Client {public static void main(String[] args) {//来一个发起人Originator originator = new Originator();originator.setState("状态1");System.out.println(originator.getState());//来一个备忘录管理员Caretaker caretaker = new Caretaker();//管理员存储发起人的备忘录caretaker.storeMemento(originator.createMemento());originator.setState("状态2");System.out.println(originator.getState());//管理员存储发起人的备忘录caretaker.storeMemento(originator.createMemento());originator.setState("状态3");System.out.println(originator.getState());//发起人从管理员获取备忘录进行回滚originator.restoreMemento(caretaker.getMemento());System.out.println(originator.getState());}
}

http://chatgpt.dhexx.cn/article/5Uy7l8IZ.shtml

相关文章

JAVA设计模式--备忘录模式

目录 一、什么是备忘录模式 二、备忘录模式的结构 三、备忘录模式的适用性 四、备忘录模式的实现 五、备忘录模式的优缺点 六、总结 一、什么是备忘录模式 备忘录(Memento)模式又叫作快照(Snapshot)模式或Token模式,是一种对象的行为模式。在备忘录模式里&am…

设计模式之备忘录模式(C++)

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 一、备忘录模式是什么? 备忘录模式是一种行为型的软件设计模式,在不破坏封装的前提下,获取一个…

什么是备忘录模式?

一、定义 备忘录模式又称快照模式,或者令牌模式。是指在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态,属于行为型模式。 二、通用写法及其uml 发起人角色&a…

行为型模式——备忘录模式(Memento Pattern)

文章目录 备忘录模式(Memento Pattern)什么是备忘录模式?UML角色应用使用模板 为什么要使用备忘录模式?优点:缺点: 怎样使用备忘录模式?在JDK中的使用 备忘录模式(Memento Pattern&a…

备忘录模式

一、备忘录模式 1、定义 备忘录模式(Memento Pattern)又称作快照模式(Snapshot Pattern),指在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态。这样以后就可将该对象恢复…

设计模式系列----备忘录模式

一、什么是备忘录模式 备忘录这个词汇大家应该都不陌生,我就经常使用备忘录来记录一些比较重要的或者容易遗忘的信息,与之相关的最常见的应用有许多,比如游戏存档,我们玩游戏的时候肯定有存档功能,旨在下一次登录游戏时…

基于MIMO讲解信道估计基本原理

为什么要进行信道估计? 信号在通过信道传输的时候,会受到信道中种种因素产生的噪声以及可能发生的多径效应,弄清信号经过的信道的特性,表征信道的技术/过程称为信道估计(Channel Estimation)。 注&#xf…

m基于深度学习的OFDM信道估计和均衡算法误码率matlab仿真,对比了LS,MMSE以及LMMSE等传统的信道估计算法

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 随着无线通信的快速发展,5G正逐渐成长为支撑全社会各行业运作的大型基础性互联网络,其服务范围的大幅扩展对底层技术提出了诸多挑战,尤其是作为物理层关键技术之一的正交频分复用(Orthogonal Fre…

IRS的信道估计基础代码

一、 智能反射平面(intelligent reflecting surfaces)是一种被动反射表面,其具有的特性是可控制反射信号的相位。 明确IRS是可控制反射信号的相位,所以以单个智能反射单元为例,该单元可调信号的参数可表示为​&#xf…

信道估计算法

目前我所涉及的是短波宽带无线信道下的接收端的处理,包括捕获、同步、信道估计及信道均衡,还有译码。百度百科里是这样解释这种信道的:短波通信发射电波要经电离层的反射才能到达接收设备,通信距离较远,是远程通信的主…

信道估计之LS算法

信道估计之LS算法 前言LS信道估计的原理总结 前言 信道估计是通信系统接收机的重要功能模块,主要是用来估计信号所经历信道的冲击响应,并用于后续的信道均衡处理,以便消除多径信号混叠造成的ISI。 信道估计的方法有很多种,…

信道估计之LMMSE估计

之前的内容讲到了MMSE信道估计,并推导了基于MMSE优化准则的估计结果,该方法是对LS信道估计的进一步优化,适用于低信噪比场合,但由于其计算复杂,所以并不实用。因此又有了LMMSE信道估计方法,相对于MMSE估计&…

详解信道估计的发展与最新研究进展(MIMO)

目录 一. MIMO信道估计的重要性 二. 最经典的两种信道估计方法 2.1 最小二乘信道估计(LS) 2.2 最小均方误差信道估计(MMSE) 三. 优化传统的MIMO信道估计技术 四. 介绍压缩感知技术 五. 基于压缩感知的MIMO信道估计 5.1 压缩感知怎么用在MIMO信道估计 5.2 改进压缩感知…

c语言差分qpsk编码信道估计 pudn,请教一下OFDM中的信道估计

在AWGN信道中没有多径 这样信道估计和均衡对结果的影响有多少dB呢? 进行了一下仿真,没有加信道编码,用LS信道估计和一阶均衡 附件是仿真的误码率对比图,从图中可以看出均衡似乎对误码率有3dB的恶化 图中横轴是SNR 其中没有均衡的曲…

m基于机器学习MLP的OFDM信道估计误码率matlab仿真,对比LS和MMSE两种信道估计算法

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 信道估计器是接收机一个很重要的组成部分。在OFDM系统中,信道估计器的设计上要有两个问题:一是导频信息的选择,由于无线信道的时变特性,需要接收机不断对信道进…

OFDM通信系统的LS信道估计均衡算法matlab仿真

目录 一、理论基础 二、核心程序 三、仿真结论 一、理论基础 OFDM主要思想是:将信道分成若干正交子信道,将高速数据信号转换成并行的低速子数据流,调制到在每个子信道上进行传输。正交信号可以通过在接收端采用相关技术来分开,…

MIMOl信道估计基本原理

为什么要进行信道估计? 信号在通过信道传输的时候,会受到信道中种种因素产生的噪声以及可能发生的多径效应,弄清信号经过的信道的特性,表征信道的技术/过程称为信道估计(Channel Estimation)。 所谓信道估计…

基于导频的信道估计实现

目录 零、前言 一、为什么要信道估计 二、导频的概念 (1)为什么要有导频 (2)导频在信道估计中作用 (3)关于导频序列的补充 三、最小二乘法估计 (1)LS信道估计算法分析 &…

DFT信道估计步骤及实例

在OFDM系统中,基于DFT的信道估计算法也经常被使用。DFT信道估计主要有以下几个步骤: (1)在实载波导频处,利用已知导频符号,使用LS信道估计算法计算得到实载波导频处信道频域响应:(原理详见此处) H ^ P _ A…

【OMP信道估计】基于OMP压缩感知的信道估计算法的MATLAB仿真

1.软件版本 MATLAB2021a2.本算法理论知识 3.核心代码 clc; clear; close all; warning off; addpath func\CYC 20; for ij 1:CYCijCYC 20;RandStream.setDefaultStream(RandStream(mt19937ar,seed,ij));Len 8;Nc 64*Len;%子载波数T …