登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
掌握设计模式--备忘录模式
掌握设计模式--备忘录模式
[ 复制链接 ]
麓吆
2025-6-3 13:38:05
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
备忘录模式(Memento Pattern)
备忘录模式(Memento Pattern)是一种行为型设计模式,用于在不暴露对象内部实现细节的情况下,捕获对象的内部状态,并在需要时恢复到先前的状态。该模式通常
用于需要撤销和恢复
操作的场景。
核心思想
:在不破坏对象封装的前提下,捕获并保存对象的内部状态,以便在需要时恢复到之前的状态。
主要组成部分
Originator(发起人)
:负责创建和保存备忘录对象。它可以恢复到之前的状态。
Memento(备忘录)
:存储发起人对象的内部状态,允许发起人恢复到此状态。它通常是一个简单的封装类,只保存状态信息。
Caretaker(看护者)
:负责管理备忘录对象的生命周期,保存备忘录,但不会修改备忘录的内容。看护者可以随时请求发起人对象创建备忘录,并在需要时提供备忘录。
案例实现
Git 是一个典型的版本控制工具,适用备忘录模式来实现简化的版本控制。备忘录模式通过保存每个文件或项目的状态快照,允许我们随时恢复到先前的版本。虽然 Git 的实现更加复杂,并且具有更多的功能(如分支管理、合并等),我们可以通过备忘录模式来实现一个简单的版本控制系统。
下面是一个使用备忘录模式模拟简单版本控制的实现:
案例类图
Commit(提交)
提交类包含着所提交的所有信息,这里仅仅记录提交时的备注信息。
public class Commit {
private final String content;
public Commit(String content) {
this.content = content;
}
public String getContent() {
return content;
}
}
复制代码
GitRepository(版本库)
public class GitRepository {
private String content;
public GitRepository(String content) {
this.content = content;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
// 创建提交(备忘录)
public Commit saveToCommit() {
return new Commit(content);
}
// 从提交恢复
public void restoreFromCommit(Commit commit) {
this.content = commit.getContent();
}
}
复制代码
VersionControl(版本控制)
为了简化代码,List的序列号为版本号
public class VersionControl {
private List<Commit> commitHistory = new ArrayList<>();
private GitRepository repository;
public VersionControl(GitRepository repository) {
this.repository = repository;
}
// 提交当前状态
public void commit() {
commitHistory.add(repository.saveToCommit());
System.out.println("Committed: " + repository.getContent());
}
// 查看历史提交
public void showHistory() {
System.out.println("Commit History:");
for (int i = 0; i < commitHistory.size(); i++) {
System.out.println("\tCommit " + (i + 1) + ": " + commitHistory.get(i).getContent());
}
}
// 恢复到某个历史提交
public void restore(int commitIndex) {
if (commitIndex >= 0 && commitIndex < commitHistory.size()) {
repository.restoreFromCommit(commitHistory.get(commitIndex));
System.out.println("Restored to: " + repository.getContent());
} else {
System.out.println("Invalid commit index!");
}
}
}
复制代码
测试代码
public class GitDemo {
public static void main(String[] args) {
// 创建一个GitRepository对象,模拟一个文件的内容
GitRepository repository = new GitRepository("初始化仓库");
// 创建版本控制系统
VersionControl versionControl = new VersionControl(repository);
// 提交当前状态
versionControl.commit();
// 修改文件内容并提交
repository.setContent("新增功能");
versionControl.commit();
// 修改文件内容并提交
repository.setContent("修复bugs");
versionControl.commit();
// 查看历史提交
versionControl.showHistory();
// 恢复到第二个提交
versionControl.restore(1);
// 修改并再次提交
repository.setContent("功能调整");
versionControl.commit();
// 查看历史提交
versionControl.showHistory();
}
}
复制代码
执行结果
Committed: 初始化仓库
Committed: 新增功能
Committed: 修复bugs
Commit History:
Commit 1: 初始化仓库
Commit 2: 新增功能
Commit 3: 修复bugs
Restored to: 新增功能
Committed: 功能调整
Commit History:
Commit 1: 初始化仓库
Commit 2: 新增功能
Commit 3: 修复bugs
Commit 4: 功能调整
复制代码
代码简析
GitRepository
类模拟一个代码文件的内容,并具有修改内容和创建备忘录(提交)的方法
Commit
类作为备忘录,保存文件的某个版本(即内容)
VersionControl
类充当版本控制系统,负责管理所有提交(备忘录),可以查看提交历史、创建新提交以及恢复历史版本
命令模式和备忘录模式对比
备忘录模式
重点在于
保存和恢复状态
,用于保存对象的历史状态并在需要时恢复,不改变对象的外部接口。
命令模式
重点在于
请求的封装和解耦
,用于将请求的发送者和接收者解耦,使得请求者不必知道如何执行操作,增加了操作的灵活性。
举例
备忘录模式
:
假设你有一个文本编辑器,用户输入了一段文本。你可以使用备忘录模式保存文本的状态,当用户点击撤销按钮时,编辑器恢复到之前保存的文本状态。
命令模式
:
假设你在一个远程控制器中,按下按钮后它发送一个命令来打开电视。电视接收命令并执行打开操作。通过命令模式,可以将按钮点击与电视操作解耦,且可以轻松实现撤销和重做功能,或将操作排队执行。
总结
备忘录模式的核心关注点是
保存对象的内部状态
,并在需要时
恢复到先前的状态
,而不暴露对象的实现细节。这通常用于实现撤销、回退功能。
状态管理
:备忘录模式允许对象在某一时刻保存状态,并且可以在以后恢复到这个状态。这对于需要撤销或恢复的应用场景非常有用,比如文本编辑器、游戏进度保存等。
内部封装
:备忘录对象封装了原对象的状态,但不允许外部直接修改这些状态,保护了原对象的内部数据。通常,备忘录对象是“只读”的,只有原对象可以恢复或修改其内容。
需要查看往期设计模式文章的,可以在个人主页中或者文章开头的集合中查看,可关注我,持续更新中。。。
超实用的SpringAOP实战之日志记录
2023年下半年软考考试重磅消息
通过软考后却领取不到实体证书?
计算机算法设计与分析(第5版)
Java全栈学习路线、学习资源和面试题一条龙
软考证书=职称证书?
软考中级--软件设计师毫无保留的备考分享
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
掌握
设计模式
备忘录
模式
相关帖子
11.结构型 - 桥接模式 (Bridge Pattern)
Spring Cloud Gateway WebFlux 模式架构分析
WebMVC 与 WebFlux 模式对比分析
13.结构型 - 适配器模式 (Adapter Pattern)
网卡混杂模式解析:从网络诊断到 Kubernetes 网络模型
14.结构型 - 外观模式 (Facade Pattern)
15.结构型 - 组合模式 (Composite Pattern)
观察者模式,发布/订阅模式,与回调函数
16.结构型 - 享元模式 (Flyweight Pattern)
AI 付费模式终极对比:ChatGPT、Gemini、Claude 定价策略拆解,谁最值得买单?
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
安全
11.结构型 - 桥接模式 (Bridge Pattern)
2
891
赖琳芳
2025-12-04
业界
Spring Cloud Gateway WebFlux 模式架构分析
1
549
国瑾瑶
2025-12-05
业界
WebMVC 与 WebFlux 模式对比分析
1
479
厂潺
2025-12-07
安全
13.结构型 - 适配器模式 (Adapter Pattern)
0
820
郦惠
2025-12-08
业界
网卡混杂模式解析:从网络诊断到 Kubernetes 网络模型
0
460
班嘉淑
2025-12-09
安全
14.结构型 - 外观模式 (Facade Pattern)
1
247
官厌
2025-12-12
安全
15.结构型 - 组合模式 (Composite Pattern)
0
434
即息极
2025-12-12
安全
观察者模式,发布/订阅模式,与回调函数
0
48
粉押淫
2025-12-13
安全
16.结构型 - 享元模式 (Flyweight Pattern)
0
700
莠畅缕
2025-12-15
安全
AI 付费模式终极对比:ChatGPT、Gemini、Claude 定价策略拆解,谁最值得买单?
0
650
匝抽
2025-12-16
回复
(2)
僻嘶
2025-11-14 20:01:24
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
收藏一下 不知道什么时候能用到
赙浦
5 天前
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
鼓励转贴优秀软件安全工具和文档!
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
安全
签约作者
程序园优秀签约作者
发帖
麓吆
5 天前
关注
0
粉丝关注
24
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
3934307807
991124
anyue1937
9994893
kk14977
6845358
4
xiangqian
638210
5
韶又彤
9997
6
宋子
9982
7
闰咄阅
9993
8
刎唇
9993
9
俞瑛瑶
9998
10
蓬森莉
9951
查看更多
今日好文热榜
547
JSAPIThree 加载单体三维模型学习笔记:Sim
118
读捍卫隐私09匿名指南
68
工作中常用函数详解与示例-PostgreSQL(其他
585
很顶!零成本克隆你的声音,这款B站开源神
674
go语言/golang 自动升级配置
961
函数式编程与传统编程的对比——基于java
228
pgAdmin 后台命令执行漏洞复现及分析(CVE-
856
度假村亲子水上乐园设备哪家质量好?
282
上下文协议(MCP)Java SDK 指南
696
Mac办公效率翻倍?Charmstone教你玩转多任
774
深耕上海14年,专业防水补漏:如何为厂房、
826
【A】字符串
461
一个完全由大模型AI Coding开发而成的程序
699
【Ubuntu】Ubuntu+VScode+ESP-IDF 的环境搭
664
60 秒出高质量科研图!Gemini+DeepSeek 绘
781
追踪链路--使用iptables/ipvs来记录后端pod
160
【译】初探 Visual Studio 2026 全新的用户
322
建筑渗漏治理的标准化实践:基于上海芮生建
54
Aspire 13:从.NET 编排工具到真正的多语言
997
用 .NET 最小化 API 构建高性能 API