- 作者:老汪软件技巧
- 发表时间:2024-10-07 15:02
- 浏览量:
定义
备忘录模式(Memento Pattern)是一种行为型设计模式,它在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
以下是备忘录模式的主要特点和定义:
主要角色
Originator(原发器) :
Memento(备忘录) :
Caretaker(负责人) :
业务
假设我们正在开发一个文本编辑器,用户可以在编辑器中输入文本,并且可以随时撤销和恢复操作。我们可以使用备忘录模式来实现这个功能。
classDiagram
class TextEditor {
-StringBuilder text
+appendText(String) : void
+save() : Memento
+restore(Memento) : void
+getText() : String
}
class Memento {
-String text
+Memento(String)
+getText() : String
}
class Caretaker {
-Memento memento
+saveMemento(Memento) : void
+getMemento() : Memento
}
TextEditor --> Memento
Caretaker "1" --> "1" Memento
一、定义原发器(Originator)首先定义文本编辑器类作为原发器:
class TextEditor {
private StringBuilder text = new StringBuilder();
public void appendText(String newText) {
text.append(newText);
}
public Memento save() {
return new Memento(text.toString());
}
public void restore(Memento memento) {
text = new StringBuilder(memento.getText());
}
public String getText() {
return text.toString();
}
}
二、定义备忘录(Memento)创建备忘录类来存储文本编辑器的状态:
class Memento {
private final String text;
public Memento(String text) {
this.text = text;
}
public String getText() {
return text;
}
}
三、定义负责人(Caretaker)负责人类负责保存和管理备忘录:
class Caretaker {
private Memento memento;
public void saveMemento(Memento memento) {
this.memento = memento;
}
public Memento getMemento() {
return memento;
}
}
四、使用备忘录模式
public class MementoPatternExample {
public static void main(String[] args) {
TextEditor textEditor = new TextEditor();
Caretaker caretaker = new Caretaker();
textEditor.appendText("Hello, ");
System.out.println("Current text: " + textEditor.getText());
// Save state
caretaker.saveMemento(textEditor.save());
textEditor.appendText("world!");
System.out.println("Current text: " + textEditor.getText());
// Undo
textEditor.restore(caretaker.getMemento());
System.out.println("After undo: " + textEditor.getText());
}
}
在这个例子中,TextEditor是原发器,它可以保存当前的文本状态到备忘录中,也可以从备忘录中恢复之前的状态。Memento是备忘录类,用于存储文本编辑器的状态。Caretaker是负责人类,负责保存和管理备忘录。通过这种方式,我们实现了文本编辑器的撤销和恢复功能,同时保持了原发器的封装性,外部类无法直接访问文本编辑器的内部状态。
总结
使用场景
需要保存一个对象在某个时刻的内部状态,以便在需要的时候恢复到这个状态。
实现撤销操作。
优点
保持了封装性。
简化了原发器的设计。
缺点
如果原发器的内部状态过多,或者状态变化频繁,可能会导致备忘录对象非常庞大,占用大量的内存空间。备忘录模式可能会增加系统的复杂性,特别是在需要管理多个备忘录对象的情况下。