当前位置: 首页 > news >正文

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

        备忘录模式是一种行为型设计模式,用于在不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后可以将该对象恢复到之前的状态。这种模式通常用于需要记录对象状态历史、撤销操作或实现“回到过去”功能的场景。
在备忘录模式中,主要有三种角色:
① 备忘录(Memento):负责存储原发器(Originator)对象的内部状态。备忘录可以根据原发器提供的接口,获取状态或者恢复状态。
② 原发器(Originator):负责创建备忘录,并记录当前内部状态到备忘录中,或者从备忘录中恢复状态。
③ 管理者(Caretaker):负责保存备忘录对象,但是不能对备忘录的内容进行操作或者检查。
备忘录模式可以让对象在不暴露其实现细节的情况下,保存和恢复其内部状态,从而提供了更好的封装性和灵活性。

1、场景设计

实现场景:设计备忘录、原发器、管理者,操作一个字符串的备忘与恢复。

2、C++实现

`Memento` 类代表备忘录,`Originator` 类是原发器,负责创建备忘录和恢复状态,`Caretaker` 类是管理者,负责保存备忘录。在 `main` 函数中,我们演示了如何使用备忘录模式来保存对象的状态,并在需要时恢复到之前的状态。 

#include <iostream>
#include <string>// 备忘录类
class Memento {private:std::string state;public:Memento(){}Memento(const std::string& s) : state(s) {}std::string getState() const {return state;}
};// 原发器类
class Originator {private:std::string state;public:void setState(const std::string& s) {state = s;}std::string getState() const {return state;}Memento createMemento() {return Memento(state);}void restoreFromMemento(const Memento& m) {state = m.getState();}
};// 管理者类
class Caretaker {private:Memento memento;public:void saveMemento(const Memento& m) {memento = m;}Memento retrieveMemento() const {return memento;}
};int main() {Originator originator;Caretaker caretaker;// 设置初始状态originator.setState("State 1");std::cout << "Current state: " << originator.getState() << std::endl;// 创建备忘录并保存caretaker.saveMemento(originator.createMemento());// 修改状态originator.setState("State 2");std::cout << "Current state: " << originator.getState() << std::endl;// 恢复到之前的状态originator.restoreFromMemento(caretaker.retrieveMemento());std::cout << "Restored state: " << originator.getState() << std::endl;return 0;
}

3、Java实现

package behavioralpattern.memento;
// 备忘录类
class Memento {private final String state;public Memento(String state) {this.state = state;}public String getState() {return state;}
}// 原发器类
class Originator {private String state;public void setState(String state) {this.state = state;}public String getState() {return state;}public Memento createMemento() {return new Memento(state);}public void restoreFromMemento(Memento memento) {state = memento.getState();}
}// 管理者类
class Caretaker {private Memento memento;public void saveMemento(Memento memento) {this.memento = memento;}public Memento retrieveMemento() {return memento;}
}public class MementoDemo {public static void main(String[] args) {Originator originator = new Originator();Caretaker caretaker = new Caretaker();// 设置初始状态originator.setState("State 1");System.out.println("Current state: " + originator.getState());// 创建备忘录并保存caretaker.saveMemento(originator.createMemento());// 修改状态originator.setState("State 2");System.out.println("Current state: " + originator.getState());// 恢复到之前的状态originator.restoreFromMemento(caretaker.retrieveMemento());System.out.println("Restored state: " + originator.getState());}
}

`Memento` 类代表备忘录,`Originator` 类是原发器,负责创建备忘录和恢复状态,`Caretaker` 类是管理者,负责保存备忘录。在 `main` 方法中,我们演示了如何使用备忘录模式来保存对象的状态,并在需要时恢复到之前的状态。

相关文章:

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

备忘录模式是一种行为型设计模式&#xff0c;用于在不破坏封装性的前提下捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;以便之后可以将该对象恢复到之前的状态。这种模式通常用于需要记录对象状态历史、撤销操作或实现“回到过去”功能的场景。 在…...

Android 系统锁屏息屏休眠时Handler CountDownTimer计时器停止运行问题解决

1.前言 在进行app开发的过程中,在进行某些倒计时的功能项目开发中,会遇到在锁屏息屏休眠一段时间的情况下, 在唤醒屏幕的情况下发现倒计时已经停止了,这是因为在系统处于休眠的状态下cpu也停止了工作,所以 handler和countdowntimer倒计时也停止了工作,接下来就来看怎么样…...

Java中如何提取视频文件的缩略图

在Java中&#xff0c;可以使用FFmpeg库来提取视频文件的缩略图。以下是一种使用FFmpeg的方法来提取视频缩略图的示例代码&#xff1a; import java.io.File; import java.io.IOException;public class VideoThumbnailExtractor {public static void main(String[] args) {Stri…...

总结 HashTable, HashMap, ConcurrentHashMap 之间的区别

前言 HashMap 本身不是线程安全的. 在多线程环境下使用哈希表可以使用: Hashtable&#xff08;不推荐使用&#xff09;ConcurrentHashMap&#xff08;推荐使用&#xff09; HashMap HashMap数据结构 根本&#xff1a; 数组 链表&#xff08;jdk1.7&#xff09;/数组链表红黑…...

《剑指 Offer》专项突破版 - 面试题 107 : 矩阵中的距离(C++ 实现)

题目链接&#xff1a;矩阵中的距离 题目&#xff1a; 输入一个由 0、1 组成的矩阵 M&#xff0c;请输出一个大小相同的矩阵 D&#xff0c;矩阵 D 中的每个格子是矩阵 M 中对应格子离最近的 0 的距离。水平或竖直方向相邻的两个格子的距离为 1。假设矩阵 M 中至少有一个 0。 …...

揭秘智慧礼品背后的故事

如若不是从事技术行业&#xff0c;在罗列礼品清单时&#xff0c;可能不会想到 “数据”&#xff0c;但幸运的是&#xff0c;我们想到了。如何将AI技术应用到当季一些最受青睐的产品中去&#xff0c;训练数据是这一智能技术的背后动力。很多电子设备或名称中带有“智能”一词的设…...

NVM的安装与配置

目录 一、简介二、下载2.1、windows环境下载地址2.2、安装 三、配置3.1、查看可安装版本3.2、安装版本3.3、使用和切换版本3.4、模块配置 四、其他4.1、全局安装pnpm4.2、常用nvm命令 一、简介 NVM&#xff0c;全称为Node Version Manager&#xff0c;是一个流行的命令行工具&a…...

[Java EE] 多线程(一) :线程的创建与常用方法(上)

1. 认识线程 1.1 概念 1.1.1 什么是线程 ⼀个线程就是⼀个"执⾏流".每个线程之间都可以按照顺序执⾏⾃⼰的代码.多个线程之间"同时"执⾏ 着多份代码. 还是回到我们之前的银⾏的例⼦中。之前我们主要描述的是个⼈业务&#xff0c;即⼀个⼈完全处理⾃⼰的…...

Linux安装docker(含Centos系统和Ubuntu系统)

一、Centos系统 1. 卸载旧版本依赖 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine 2. 设置仓库 安装所需的软件包。yum-utils 提供了 yum-config-manager &…...

【第十五届蓝桥杯大赛软件赛省赛】———— C/C++ 大学B组

蓝桥杯2024年15届省赛b组原题献上...

Redis+lua脚本限制ip多次输入错误密码

Redislua脚本限制ip多次输入错误密码 不能锁username&#xff0c;因为如果有人恶意保留破解密码的话。会导致用户本人无法登录。 这里我采用 以ip的方式进行锁定。利用redis 设置key&#xff1a;ip。value&#xff1a;当前ip尝试登录的次数 实现逻辑 逻辑简单&#xff0c;假设…...

全球顶级的低代码开发平台,你知道几个?

什么是低代码开发平台? 低码开发平台是一个应用程序,提供图形用户界面编程,从而以非常快的速度开发代码,减少了传统的编程工作。 这些工具有助于快速开发代码,最大限度地减少手工编码的努力。这些平台不仅有助于编码,而且还能快速安装和部署。 低码开发工具的好处 低代码平…...

11-1.Vue2.x基本列表—v-for

文章目录 Vue2.x基本列表—v-for Vue2.x基本列表—v-for <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>基本列表</title><script type"text/javascript" src"../js/vue.j…...

一本书精通推荐算法,轻松搞定入门、面试、进阶

当前互联网高速发展&#xff0c;用户规模和内容规模均迅猛提升。 身处信息严重过载的时代&#xff0c;如何让用户从海量信息中发现自己感兴趣的内容&#xff0c;成了很多公司的核心问题。 在此背景下&#xff0c;搜索系统和推荐系统应运而生。 前者主要解决用户主动寻找内容…...

ADB的基本语法及常用命令

学习网址 ADB命令的基本语法如下&#xff1a; adb [-d|-e|-s <serialNumber>] <command> 如果有多个设备/模拟器连接&#xff0c;则需要为命令指定目标设备。 参数及含义如下&#xff1a; 常用命令如下&#xff1a; 1. 启动ADB服务 adb start-server 2. 停止…...

Linux之bpfjit(2)使用分析和mini-tcpdump实现

Linux之bpfjit(2)使用分析和mini-tcpdump实现 Author: Once Day Date: 2024年4月13日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可以参考专栏&#xff1a;…...

adb常用命令汇总

Android Debug Bridge (adb) 是一个多功能命令行工具&#xff0c;它允许你与连接的Android设备或在电脑上的Android模拟器进行通信。下面列出了一些常用的adb命令&#xff1a; 启动adb服务&#xff1a; adb start-server停止adb服务&#xff1a; adb kill-server查看已连接的设…...

JVM虚拟机(三)垃圾回收简介、垃圾回收算法、分代回收、垃圾回收器种类、G1垃圾回收器

目录 一、什么是垃圾回收&#xff1f;1.1 什么是垃圾回收&#xff1f;1.2 什么对象能被垃圾回收&#xff1f;1&#xff09;引用计数法2&#xff09;可达性分析算法 二、JVM 垃圾回收算法2.1 标记清除算法2.2 标记整理算法&#xff08;标记压缩算法&#xff09;2.3 复制算法2.4 …...

JavaScript基础:js介绍、变量、数据类型以及类型转换

目录 介绍 引入方式 内部方式 外部形式 注释和结束符 单行注释 多行注释 结束符 输入和输出 输出 输入 变量 声明 赋值 关键字 变量名命名规则 常量 数据类型 数值类型 字符串类型 布尔类型 undefined 类型转换 隐式转换 显式转换 Number ✨介绍 &a…...

【牛客SQL快速入门】SQL基础(三)

一、条件函数 IF 条件函数 IF函数是最常用到的条件函数&#xff0c;写法为 if(xn,a,b)&#xff0c;xn代表判断条件&#xff0c;如果xn时&#xff0c;那么结果返回a&#xff0c;否则返回b。 -- 把非北京大学的用户统一归为其他大学 Select device_id,if(university ‘北京大…...

LangGPT:革新自然语言编程的结构化提示词框架

LangGPT&#xff1a;革新自然语言编程的结构化提示词框架 【免费下载链接】LangGPT LangGPT: Empowering everyone to become a prompt expert!&#x1f680; Structured Prompt&#xff0c;Language of GPT, 结构化提示词&#xff0c;结构化Prompt 项目地址: https://gitcod…...

OpenClaw硬件选购指南:百川2-13B-4bits量化版在不同GPU上的表现

OpenClaw硬件选购指南&#xff1a;百川2-13B-4bits量化版在不同GPU上的表现 1. 为什么需要关注硬件配置 去年冬天&#xff0c;当我第一次尝试在本地部署OpenClaw对接百川2-13B模型时&#xff0c;我的旧显卡GTX 1660 Ti直接崩溃了。那次经历让我深刻认识到——选择合适的硬件对…...

工业视觉代码交付总被退回?(甲方验收必查的6项硬性指标:实时性≤35ms、重复精度±0.015px、抗电磁干扰日志完备性)

第一章&#xff1a;工业视觉代码交付失败的典型归因分析工业视觉系统在产线部署阶段频繁遭遇代码交付失败&#xff0c;其根本原因往往并非算法性能不足&#xff0c;而是工程化落地环节存在系统性疏漏。以下从环境适配、数据闭环、接口契约三个维度展开典型归因。运行时环境不一…...

RTX4090D显存优化:OpenClaw+Qwen3-32B-Chat批量处理千页PDF

RTX4090D显存优化&#xff1a;OpenClawQwen3-32B-Chat批量处理千页PDF 1. 为什么需要显存优化 当我第一次尝试用OpenClaw对接Qwen3-32B-Chat处理PDF文档时&#xff0c;遇到了一个棘手的问题——显存爆炸。当时只是处理一个200页的PDF&#xff0c;显存占用就飙到了22GB&#x…...

LangGraph实战:5分钟给你的AI助手装上‘对话记忆’,告别每轮都是新朋友

LangGraph实战&#xff1a;5分钟为AI助手构建对话记忆系统 每次和AI对话都像初次见面&#xff1f;这个问题困扰着许多开发者。想象一下&#xff0c;你告诉助手"我叫Alex"&#xff0c;下一句问"你知道我的名字吗&#xff1f;"&#xff0c;它却一脸茫然地回答…...

微信无法登录时的恢复操作

本文记录 OpenClaw 中 openclaw-weixin 插件在登录态丢失、微信链接不可用、扫码登录失败时的恢复流程。2026-03-23 版本 OpenClaw 更新后曾出现微信插件失效,但在 2026-03-24 版本中已恢复。本文目标是先判断问题类型,再选择最小影响的修复方式,避免不必要的全量重装。 一、…...

80+经典游戏的现代救赎:WidescreenFixesPack让老游戏焕发新生

80经典游戏的现代救赎&#xff1a;WidescreenFixesPack让老游戏焕发新生 【免费下载链接】WidescreenFixesPack Plugins to make or improve widescreen resolutions support in games, add more features and fix bugs. 项目地址: https://gitcode.com/gh_mirrors/wi/Widesc…...

从GTS-800到GTS-400:手把手教你移植C#点胶机程序到不同固高控制卡

从GTS-800到GTS-400&#xff1a;工业点胶系统迁移实战指南 当生产线上的点胶机控制卡需要从GTS-800更换为GTS-400时&#xff0c;许多工程师会发现"使用方法类似"这个说法背后隐藏着大量细节差异。去年我们团队完成了一个医疗设备点胶系统的迁移项目&#xff0c;原计划…...

各向异性方解石晶体的双折射效应

1. 摘要 双折射效应是各向异性材料最重要的光学特性&#xff0c;并广泛应用于多种光学器件。当入射光波撞击各向异性材料&#xff0c;会以不同的偏振态分束到不同路径&#xff0c;即众所周知的寻常光束和异常光束。在本示例中&#xff0c;描述了如何利用VirtualLab Fusion对双折…...

手把手教你用STM32F103驱动ST7565R芯片的JLX12864G屏幕(附取模工具配置)

STM32F103驱动ST7565R液晶屏的深度开发指南 在嵌入式显示领域&#xff0c;128x64分辨率的单色液晶屏因其性价比高、接口简单而广受欢迎。本文将深入探讨基于STM32F103微控制器驱动ST7565R芯片的JLX12864G液晶屏的完整技术方案&#xff0c;从硬件连接到高级显示功能的实现&#…...