【玩转23种Java设计模式】行为型模式篇:备忘录模式
软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
汇总目录链接:【玩转23种Java设计模式】学习目录汇总整理
文章目录
- 一、简介
- 二、实例
- 1、文本编辑器(TextEditor)
- 2、管理者(Caretaker)
- 3、客户端(MementoPatternExample)
- 三、总结
- 1、优点
- 2、缺点
- 3、应用场景
一、简介
备忘录模式(Memento Pattern)是一种行为型设计模式,用于保存对象的状态,以便在未来可以恢复到之前的某个状态。该模式避免了直接暴露对象的内部状态,从而实现了数据的封装性。
主要角色:
- Originator(发起人):创建并存储自身状态到备忘录中,可以从备忘录中恢复状态。
- Memento(备忘录):存储发起人的状态,提供给发起人恢复状态的接口。
- Caretaker(管理者):负责保存和管理备忘录,但不能操作备忘录内容。
二、实例
例如:模拟文本编辑器中“撤销”操作的实现。
1、文本编辑器(TextEditor)
class TextEditor {
private String text;
public void setText(String text) {
this.text = text;
}
public String getText() {
return text;
}
// 创建备忘录
public Memento save() {
return new Memento(text);
}
// 从备忘录恢复状态
public void restore(Memento memento) {
this.text = memento.getText();
}
// Memento:备忘录内部类
static class Memento {
private final String text;
private Memento(String text) {
this.text = text;
}
private String getText() {
return text;
}
}
}
2、管理者(Caretaker)
class Caretaker {
private final List<TextEditor.Memento> mementoList = new ArrayList<>();
public void addMemento(TextEditor.Memento memento) {
mementoList.add(memento);
}
public TextEditor.Memento getMemento(int index) {
return mementoList.get(index);
}
}
3、客户端(MementoPatternExample)
public class MementoPatternExample {
public static void main(String[] args) {
TextEditor editor = new TextEditor();
Caretaker caretaker = new Caretaker();
// 初始状态
editor.setText("Hello");
System.out.println("Initial Text: " + editor.getText());
caretaker.addMemento(editor.save());
// 修改状态1
editor.setText("Hello, World");
System.out.println("Updated Text: " + editor.getText());
caretaker.addMemento(editor.save());
// 修改状态2
editor.setText("Hello, Design Patterns");
System.out.println("Updated Text: " + editor.getText());
caretaker.addMemento(editor.save());
// 撤销操作
editor.restore(caretaker.getMemento(1));
System.out.println("After Undo: " + editor.getText());
// 再次撤销
editor.restore(caretaker.getMemento(0));
System.out.println("After Second Undo: " + editor.getText());
}
}
三、总结
1、优点
- 封装性好:发起人和备忘录内部状态的实现细节对外界透明,保证了对象的封装性。
- 状态恢复:可以轻松保存和恢复对象的状态,适合需要频繁回退操作的场景。
- 灵活性高:支持保存多个状态,提供多种恢复方式。
2、缺点
- 资源消耗大:如果状态对象较大或需要保存的状态很多,可能会消耗较多内存。
- 管理复杂:需要一个管理机制来保存和恢复状态,增加了系统复杂性。
3、应用场景
- 撤销和重做功能:如文本编辑器、图形编辑器。
- 游戏存档:在游戏中保存和恢复玩家的进度。
- 事务性操作:在操作失败时可以回滚到之前的状态。
- 状态恢复:适用于需要频繁切换对象状态的场景。