设计模式 - 备忘录模式(Memento Pattern)
介绍
备忘录模式是一种行为设计模式,它允许你在不破坏封装性的前提下捕获和存储对象的内部状态,以便稍后恢复。这种模式通常用于实现撤销功能,或者在复杂对象的状态需要备份和恢复时使用。
实现
我们以一个简单的文字编辑器为例,来说明如何使用备忘录模式来保存文档的状态,并在需要时恢复。
定义备忘录类
首先定义一个备忘录类,它存储了对象的状态。
class DocumentMemento {
private String content;
public DocumentMemento(String content) {
this.content = content;
}
public String getContent() {
return content;
}
}
创建发起人(Originator)类
然后创建一个发起人类,它负责创建备忘录并恢复其状态。
class Document {
private String content;
public Document(String content) {
this.content = content;
}
public void setContent(String content) {
this.content = content;
}
public String getContent() {
return content;
}
public DocumentMemento createMemento() {
return new DocumentMemento(content);
}
public void restoreMemento(DocumentMemento memento) {
content = memento.getContent();
}
}
创建管理者(Caretaker)类
创建一个管理者类,它负责保存备忘录对象,通常由客户端来充当这个角色。
class DocumentManager {
private Stack<DocumentMemento> mementos = new Stack<>();
public void addMemento(DocumentMemento memento) {
mementos.push(memento);
}
public DocumentMemento getMemento() {
return mementos.pop();
}
}
使用备忘录模式
接下来,在主程序中使用备忘录模式来保存文档的状态,并在需要时恢复。
public class TextEditor {
public static void main(String[] args) {
Document document = new Document("Initial content.");
DocumentManager manager = new DocumentManager();
// 修改文档内容并保存备忘录
document.setContent("Updated content.");
manager.addMemento(document.createMemento());
System.out.println("Current content: " + document.getContent());
// 再次修改文档内容
document.setContent("Final content.");
System.out.println("New content: " + document.getContent());
// 恢复之前的状态
document.restoreMemento(manager.getMemento());
System.out.println("Restored content: " + document.getContent());
}
}
使用场景
备忘录模式适用于以下情况:
- 需要保存/恢复数据的相关状态,而不破坏封装性。
- 需要一个可滚动的历史记录。
- 需要实现撤销(Undo)功能。
总结
备忘录模式通过将对象的状态保存在一个独立的对象(备忘录)中,使得对象可以在任何时候恢复到某个特定的状态。这种方式不仅保护了对象的内部状态,还支持撤销操作和版本控制等功能。
以上就是备忘录模式的一个实现案例,希望这篇文章能帮助你理解备忘录模式的使用方式及其优势。
评论区