设计模式(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` 方法中,我们演示了如何使用备忘录模式来保存对象的状态,并在需要时恢复到之前的状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/821269.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

突破编程_前端_SVG(使用 svg-pan-zoom 库进行平移与缩放)

1 svg-pan-zoom 概述 svg-pan-zoom 是一个轻量级、高性能且易于使用的 JavaScript 库&#xff0c;专为增强 SVG 图像的浏览体验而设计。它提供了平移和缩放功能&#xff0c;使用户能够无缝探索大型或复杂的 SVG 图形。这个库允许用户对SVG图像进行交互操作&#xff0c;包括缩放…

企业数据模型应用:数字化转型的关键引擎

一、引言 在数字化浪潮席卷全球的今天&#xff0c;数据已经成为企业运营、决策和创新的核心要素。企业数据模型作为数据管理的核心工具&#xff0c;正逐渐成为企业数字化转型的重要引擎。本文将深入探讨企业数据模型的基本概念、应用场景、挑战与对策&#xff0c;以及其在数字…

NL2SQL基础系列(1):业界顶尖排行榜、权威测评数据集及LLM大模型(Spider vs BIRD)全面对比优劣分析[Text2SQL、Text2DSL]

NL2SQL基础系列(1)&#xff1a;业界顶尖排行榜、权威测评数据集及LLM大模型&#xff08;Spider vs BIRD&#xff09;全面对比优劣分析[Text2SQL、Text2DSL] Text-to-SQL&#xff08;或者Text2SQL&#xff09;&#xff0c;顾名思义就是把文本转化为SQL语言&#xff0c;更学术一…

数据结构——双向循环链表

目录 前言 一、链表的分类 二、双向循环链表 2.1 开辟新的节点 2.2 链表初始化 2.3 打印链表 2.4 链表的尾插 2.5 链表的头插 2.6 链表的尾删 2.7 链表的头删 2.8 查找链表 2.9 在pos位置之后插入数据 2.10 删除pos位置的数据 三、完整代码实现 四、顺序表和双向…

[lesson37]智能指针分析

智能指针分析 永恒的话题 内存泄漏(臭名昭著的bug) 动态申请堆空间&#xff0c;用完后不归还C语言中没有垃圾回收的机制指针无法控制所指堆空间的生命周期 深度的思考 我们需要什么&#xff1f; 需要一个特殊的指针指针生命周期结束时主动释放堆空间一片堆空间最多只能由一…

Qt——【若按钮点击后无反应,UI界面中已经勾选Checkable属性, 并且调用了按钮的setchecked(false), 但是页面就是不切换状态

几经排查&#xff0c;发现是按钮组的Exclusive属性造成的。Exclusive属性执行后&#xff0c; 当有一个选中&#xff0c;并且没有选择其它按钮时&#xff0c;此按钮一直为选中状态。即使执行了按钮的setchecked&#xff08;false&#xff09;。 如果QAbstractButton属于独占组&a…

【C/C++笔试练习】read函数、虚拟存储、用户态、线程特点、缺页处理、调度算法、进程优先级、锁的使用、创建进程、不用加减乘除做加法、三角形

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;read函数&#xff08;2&#xff09;虚拟存储&#xff08;3&#xff09;用户态&#xff08;4&#xff09;线程特点&#xff08;5&#xff09;缺页处理&#xff08;6&#xff09;调度算法&#xff08;7&#xff09;进程优先…

IP地址和目标端口简介

IP地址和目标端口都是网络通信中重要的概念&#xff0c;它们共同作用来确保数据能够正确地传输到目标设备。 IP地址&#xff08;Internet Protocol Address&#xff09;是互联网上每个设备的唯一标识符。它由四个数字组成&#xff0c;每个数字之间用点&#xff08;.&#xff0…

服务器Linux搭建NPM私有仓库

服务器Linux搭建NPM私有仓库 环境搭建 安装 nodejs nodejs官网&#xff1a;https://nodejs.org/en/download/package-manager 可以去官网自行下载nodejs的Linux版本&#xff0c;但是出于别的原因考虑&#xff0c;可以使用nvm去下载nodejs这样会切换nodejs也方便。 nvm 这…

ubuntu20.04基础镜像中jdk8.0中文乱码问题(需要加上ENV LANG C.UTF-8和ENV LC_ALL C.UTF-8)

文章目录 描述原因解决 描述 # 基础镜像 FROM ubuntu:20.04# 避免在安装过程中&#xff0c;有些程序需要交互式输入&#xff08;如地区设置等&#xff09; ARG DEBIAN_FRONTENDnoninteractive# 更新软件包列表&#xff0c;安装必要的软件包 RUN apt-get update && apt…

Android 混淆模板

保持对外门面类 -keep public class com.xx.devtools.middle.manager.DevLogManager { public *; } 保持model类 -keep public class com.xx.devtools.middle.model.** { public *; } -keep public class com.xx.devtools.middle.Globals { public *; } 保持Bus注册方法 -…

整数运算超越存储单元表示范围:上溢出、下溢出、回绕

示例&#xff1a; /*** brief how about integer-underflow-overflow? show you here.* author wenxuanpei* email 15873152445163.com(query for any question here)*/ #define _CRT_SECURE_NO_WARNINGS//support c-library in Microsoft-Visual-Studio #include <std…

P5730 【深基5.例10】显示屏

思路&#xff1a; 此题只需要两层循环&#xff0c;通过数组映射即可求出答案 AC代码&#xff1a; #include<iostream>using namespace std;typedef long long ll; const int N 10; int a[N];int main() {ll n,m;cin >> n >> m;for(ll in;i<m;i){ll nu…

org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is ja

具体报错&#xff1a; org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.AbstractMethodError: Receiver class org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient does not define or inher…

leetcode:42.接雨水

单调栈解题思路&#xff1a; 需要知道当前遍历到的元素左边和右边第一个比该元素大的元素。 如果当前遍历到的元素大于栈顶元素&#xff0c;则该元素为栈顶元素右边第一个比它大的元素&#xff0c;此时&#xff0c;栈顶元素的栈内相邻元素是该元素左边第一个比它大的元素。【…

亚马逊登录数据筛选

亚马逊登录接口逆向分析 前言方法策略 前言 最近因为工作需要研究了下亚马逊的登录接口&#xff0c;找到了验证登录账户的使用方法。 方法策略 批量检验亚马逊账户是一件非常费事费力的事情&#xff0c;使用 selenium 在网页上操作&#xff0c;一分钟才能筛选两三个&#xf…

设计模式(021)行为型之访问者模式

访问者模式是一种行为型设计模式&#xff0c;它可以在不修改现有代码结构的情况下&#xff0c;为复杂的对象结构添加新的操作。该模式将数据结构和数据操作进行分离&#xff0c;使得数据结构可以独立于操作进行变化&#xff0c;同时也可以在不改变操作的前提下增加新的操作。 在…

如何自己制作一个网址二维码,可追踪扫描数据?

我们最近收到许多这样的咨询&#xff1a;如何生成能够追踪扫描次数的二维码&#xff1f;那么通过今天的文章&#xff0c;您就可以了解到什么样的二维码可以追踪扫描数据&#xff1f;以及如何制作能够追踪扫描数据的二维码&#xff1f; 一、哪种二维码可以追踪扫描数据&#xf…

python-pytorch实现skip-gram 0.5.001

python-pytorch实现skip-gram 0.5.000 数据加载、切词准备训练数据准备模型和参数训练保存模型加载模型简单预测获取词向量画一个词向量的分布图使用词向量计算相似度参考数据加载、切词 按照链接https://blog.csdn.net/m0_60688978/article/details/137538274操作后,可以获得…

智慧园区开启未来之门:揭秘科技创新如何引领园区发展,构建智慧化生活新场景

随着科技的飞速发展和全球经济的深度融合&#xff0c;智慧园区以其前瞻性的理念、创新的技术和卓越的成果&#xff0c;正成为引领城市发展和产业升级的新引擎。本文将深入探讨智慧园区如何借助科技创新的力量&#xff0c;引领园区发展&#xff0c;并构建智慧化生活新场景&#…