备忘录模式

article/2025/11/11 17:24:11

一、备忘录模式

1、定义

备忘录模式(Memento Pattern)又称作快照模式(Snapshot Pattern),指在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态,属于行为型设计模式。

状态模式的本质是从发起人实体类(Originator)隔离存储功能,降低实体类的职责。

2、结构

(1)模式的结构

主要角色如下:

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

3、优缺点

优点:

  • 简化发起人实体类(Originator)的职责,隔离状态存储与获取,实现了信心的封装,客户端无须关心状态的保存细节。
  • 提供状态的回滚功能。

缺点:

  • 消耗资源:如果需要保存的状态过多,则每一次保存都会消耗很多内存。

4、使用场景

  • 需要保存历史快照的场景。
  • 希望在对象之外保存状态,且除了自己,其他类 对象无法访问状态保存的具体内容。

二、模式的通用实现

代码如下:

public class MementoPattern {public static void main(String[] args) {Originator originator = new Originator();originator.setState("init do something");//保存备忘录IMemento memento = originator.createMemento();Caretaker caretaker = new Caretaker();caretaker.storeMemento(memento);System.out.println("--------第一次保存,状态如下:---------");System.out.println(originator.getState());//回滚originator.restoreMemento(caretaker.getMemento());System.out.println("-------回滚之后---------");}
}//发起人角色
class Originator{//内部状态private String state;public String getState() {return state;}public void setState(String state) {this.state = state;}public IMemento createMemento(){return new Memento(this.state);}public void restoreMemento(IMemento memento){this.state = ((Memento) memento).state;}static class Memento implements IMemento{private String state;public Memento(String state) {this.state = state;}public String getState() {return state;}public void setState(String state) {this.state = state;}}
}// 备忘录角色
interface IMemento{}//备忘录管理员角色
class Caretaker{private IMemento memento;public IMemento getMemento() {return memento;}public void storeMemento(IMemento memento){this.memento = memento;}
}

三、模式的应用实例

以草稿箱为例。

(1)编辑器 - 发起人角色

@Data
@AllArgsConstructor
@ToString
public class Editor {private String title;private String content;public ArticleMemento saveToMemento(){ArticleMemento articleMemento = new ArticleMemento(this.title, this.content);return articleMemento;}public void undoFromMemento(ArticleMemento articleMemento){this.title = articleMemento.getTitle();this.content = articleMemento.getContent();}}

(2)文章-备忘录角色

@AllArgsConstructor
@ToString
@Getter
public class ArticleMemento {private String title;private String content;}

(3)草稿箱 - 备忘录管理员角色

public class DraftsBox {// 存储 - 后进先出private final Stack<ArticleMemento> STACK = new Stack<>();public ArticleMemento getMemento() {ArticleMemento articleMemento = STACK.pop();return articleMemento;}public void addMemento(ArticleMemento articleMemento) {STACK.push(articleMemento);}
}

(4)测试

	public static void main(String[] args) {DraftsBox draftsBox = new DraftsBox();Editor editor = new Editor("init title", "首次发表");ArticleMemento articleMemento = editor.saveToMemento();draftsBox.addMemento(articleMemento);System.out.println("--------第一次编辑,保存草稿之后,信息如下:---------");System.out.println(editor);editor.setTitle("one update");editor.setContent("第一次修改");ArticleMemento articleMemento1 = editor.saveToMemento();draftsBox.addMemento(articleMemento1);System.out.println("--------第一次修改,保存草稿之后,信息如下:---------");System.out.println(editor);editor.setTitle("two update");editor.setContent("第二次修改");//ArticleMemento articleMemento2 = editor.saveToMemento();//draftsBox.addMemento(articleMemento2);System.out.println("--------第一次修改,还没保存草稿,信息如下:---------");System.out.println(editor);System.out.println("-------撤销操作---------");ArticleMemento memento = draftsBox.getMemento();editor.undoFromMemento(memento);System.out.println("--------第一次撤销,之后,信息如下:---------");System.out.println(editor);ArticleMemento memento2 = draftsBox.getMemento();editor.undoFromMemento(memento2);System.out.println("--------第二次撤销,之后,信息如下:---------");System.out.println(editor);}

在这里插入图片描述

– 求知若饥,虚心若愚。


http://chatgpt.dhexx.cn/article/IS2cnkYj.shtml

相关文章

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

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

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

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

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

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

IRS的信道估计基础代码

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

信道估计算法

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

信道估计之LS算法

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

信道估计之LMMSE估计

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

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

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

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

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

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

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

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

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

MIMOl信道估计基本原理

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

基于导频的信道估计实现

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

DFT信道估计步骤及实例

在OFDM系统中&#xff0c;基于DFT的信道估计算法也经常被使用。DFT信道估计主要有以下几个步骤: (1)在实载波导频处&#xff0c;利用已知导频符号&#xff0c;使用LS信道估计算法计算得到实载波导频处信道频域响应&#xff1a;&#xff08;原理详见此处&#xff09; 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 …

OFDM学习笔记(四)(信道估计简介)

目录 1.基本介绍2.慢衰落信道下的信道估计算法2.1 基于DFT的信道估计算法2.2 基于SVD的信道估计算法2.3 基于滤波器的信道估计算法2.4 最大似然估计算法 相干解调在实际中应用的比差分解调多很多。而信道估计作为相干解调的主要技术就尤为重要。 信道估计器是接收机一个很重要…

信道估计(一):信道估计基础知识

信道估计&#xff08;一&#xff09;&#xff1a;信道估计基础知识 零.概述 本专栏主要是学习文章《Channel Estimation and Prediction for 5G Applications》而做的一些笔记&#xff0c;里面补充了一些我不知道的基础知识&#xff0c;希望能帮到大家 后续会详细学习其中的…

移动通信基础(5)信道估计

目录 基于LS的信道估计算法&#xff08;最小二乘法&#xff09; MMSE信道估计算法&#xff08;最小均方误差算法&#xff09; 线性最小均方误差信道估计算法((LMMSE) 基于指数型PDP的LMMSE信道估计 基于导频的信道估计方法 基于块状导频的信道估计 基于梳状导频的信道估计 基…

信道估计基础知识

OFDM系统中的信道估计基础知识_逸凌Time的博客-CSDN博客_信道估计的目的是什么 一、什么是信道估计 信道估计是使用接收信号表现出来的各种状态来对信道的特性进行估计的过程。信道估计是信道对输入信号影响的一种数学表示。 信道估计可以定义为描述物理信道对输入信号的影响而…

信道估计(channel estimation)图解——从SISO到MIMO原理介绍

文章目录 1. 引言2. 通用算法3. SISO的信道估计3.1 信道系数的估计3.2 噪声的估计 4. 2 x 2 MIMO的信道估计4.1 信道系数的估计4.2 噪声的估计 参考 1. 引言 在所有通信中&#xff0c;信号都会通过一个介质&#xff08;称为信道&#xff09;&#xff0c;并且信号会失真&#xf…