登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
每日签到
每天签到奖励2圆-6圆
发帖说明
VIP申请
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
VIP申请
VIP网盘
网盘
联系我们
每日签到
道具
勋章
任务
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
掌握设计模式--备忘录模式
掌握设计模式--备忘录模式
[ 复制链接 ]
麓吆
2025-6-3 13:38:05
备忘录模式(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全栈学习路线、学习资源和面试题一条龙
软考证书=职称证书?
软考中级--软件设计师毫无保留的备考分享
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
掌握
设计模式
备忘录
模式
相关帖子
高效查日志进阶指南:掌握grep命令的完整技巧
分层架构模式深度解析
六边形架构模式深度解析
夜莺监控的几种架构模式详解
Java 集合--快速掌握涵盖三大场景实现的Set集合底层原理
VASP计算其他性质(备忘录)
SwiftUI-备忘录列表完整功能清单
KMP 模式串匹配算法讲解
设计模式之单例模式
vip免费申请,1年只需15美金$
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
安全
高效查日志进阶指南:掌握grep命令的完整技巧
0
811
映各
2025-07-28
安全
分层架构模式深度解析
0
1106
冈欤寨
2025-08-03
业界
六边形架构模式深度解析
0
518
梁宁
2025-08-07
业界
夜莺监控的几种架构模式详解
0
214
阕阵闲
2025-08-14
业界
Java 集合--快速掌握涵盖三大场景实现的Set集合底层原理
0
409
澹台忆然
2025-08-18
业界
VASP计算其他性质(备忘录)
0
924
向梦桐
2025-08-26
业界
SwiftUI-备忘录列表完整功能清单
0
1015
痕厄
2025-08-28
安全
KMP 模式串匹配算法讲解
0
317
赶塑坠
2025-09-02
安全
设计模式之单例模式
0
77
颖顿庐
2025-09-03
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
安全
签约作者
程序园优秀签约作者
发帖
麓吆
2025-6-3 13:38:05
关注
0
粉丝关注
20
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
敖可
9984
杭环
9988
凶契帽
9988
4
氛疵
9988
5
黎瑞芝
9988
6
猷咎
9986
7
里豳朝
9986
8
肿圬后
9986
9
蝓俟佐
9984
10
虽裘侪
9984
查看更多