😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~
什么是备忘录模式
备忘录模式(Memento Pattern
)是一种行为型设计模式,它用于在不破坏对象封装性的前提下,捕获对象的内部状态并在对象之外保存这些状态,以便在将来可以将对象恢复到之前的状态。
备忘录模式的核心思想是将对象的状态保存到备忘录对象中,然后可以将备忘录对象保存在一个管理者(或称为负责人)对象中,这样可以在需要的时候将对象恢复到之前的状态。
备忘录模式类图
备忘录模式的类图包含三个主要角色:Originator(原发器)、Memento(备忘录)和Caretaker(负责人)
下面是备忘录模式的类图:
-
Originator(原发器):负责创建备忘录对象,并记录当前状态到备忘录对象中。同时,它也可以从备忘录对象中恢复之前保存的状态。
-
Memento(备忘录):用于存储 Originator 对象的内部状态,并提供获取状态和设置状态的方法。
-
Caretaker(负责人):负责管理备忘录对象,可以存储多个备忘录对象,用于保存
备忘录模式适用场景
备忘录模式适用于以下场景:
-
需要保存和恢复对象的状态:当需要保存对象的状态,以便在之后的某个时间点将对象恢复到之前的状态时,可以使用备忘录模式
-
需要实现撤销和恢复功能:备忘录模式可以实现撤销和恢复功能,当用户需要撤销某个操作时,可以将对象恢复到之前的状态
-
需要保护对象的封装性:备忘录模式可以在不破坏对象的封装性的前提下,保存对象的内部状态
-
需要对对象的历史状态进行管理:备忘录模式可以将对象的历史状态保存在管理者对象中,可以方便地管理多个备忘录对象
备忘录模式适用于需要保存和恢复对象的状态,实现撤销和恢复功能,以及保护对象的封装性的场景。它可以帮助我们在不破坏对象封装性的前提下,实现对对象状态的管理和恢复。
现实生活案例
假设你正在使用一个文本编辑器,在编辑一份重要的文件时,突然遇到了计算机系统崩溃的情况。你担心之前编辑的内容会丢失,因此希望能够恢复到之前的编辑状态。这时,备忘录模式可以派上用场。
在这个生活案例中,你可以将文本编辑器视为 Originator
,它负责创建备忘录对象并保存当前的编辑状态;文本编辑器的编辑内容可以看作 Originator
的状态。而备忘录对象则是 Memento
,用于保存编辑器的状态快照。你可以将备忘录对象保存在一个备忘录管理器中,作为 Caretaker
,以便在需要的时候可以方便地恢复到之前的编辑状态。
根据上述案例用java代码模拟:
首先,我们定义 Memento 类来保存编辑器的状态:
// Memento 类用于保存编辑器的状态
public class Memento {
private final String content;
public Memento(String content) {
this.content = content;
}
public String getContent() {
return content;
}
}
然后,我们定义 TextEditor 类作为 Originator,负责创建备忘录对象并保存当前的编辑状态:
// TextEditor 类作为 Originator,负责创建备忘录对象并保存当前的编辑状态
public class TextEditor {
private String content;
public void write(String content) {
this.content = content;
}
public Memento save() {
return new Memento(content);
}
public void restore(Memento memento) {
this.content = memento.getContent();
}
public String getContent() {
return content;
}
}
接下来,我们定义 TextEditorHistory 类作为 Caretaker,负责管理备忘录对象:
// TextEditorHistory 类作为 Caretaker,负责管理备忘录对象
import java.util.Stack;
public class TextEditorHistory {
private Stack<Memento> history = new Stack<>();
public void save(Memento memento) {
history.push(memento);
}
public Memento undo() {
if (!history.isEmpty()) {
return history.pop();
}
return null;
}
}
最后,我们来进行测试:
public class MementoPatternTest {
public static void main(String[] args) {
TextEditor textEditor = new TextEditor();
TextEditorHistory history = new TextEditorHistory();
// 编辑文本
textEditor.write("这是初始文本内容");
System.out.println("当前编辑内容:" + textEditor.getContent());
// 保存当前状态到备忘录中
history.save(textEditor.save());
// 继续编辑文本
textEditor.write("使用备忘录模式编辑");
System.out.println("当前编辑内容:" + textEditor.getContent());
// 恢复到之前的状态
Memento previousState = history.undo();
if (previousState != null) {
textEditor.restore(previousState);
System.out.println("恢复后的编辑内容:" + textEditor.getContent());
} else {
System.out.println("无可恢复的状态。");
}
}
}
最终运行效果:
在上述代码中,我们创建了一个文本编辑器 TextEditor
,可以通过 write
方法来编辑文本内容,通过 save
方法将当前状态保存到备忘录中,通过 restore
方法将编辑器恢复到之前的状态。我们还创建了 TextEditorHistory
类来管理备忘录对象,可以通过 save
和 undo
方法来保存状态和撤销状态。
结语
本章节主要介绍了备忘录模式、备忘录模式适用场景、以日常使用的文本编辑器来演示备忘录模式,如果本文对你有用,欢迎关注收藏评论,后续将陆续推出更多优质的博文与大家一起分享交流~
原创不易转载请注明出处:CSND - Micro麦可乐的博客 https://blog.csdn.net/lhmyy521125