1. 设计模式-备忘录模式
备忘录模式(Memento Pattern)是一种行为设计模式,它提供了一种在不破坏封装性的前提下,捕获并保存一个对象的内部状态,并能在以后恢复到该状态的机制。备忘录模式通常用于实现撤销操作,以及在需要时回滚到之前的状态。
备忘录模式涉及三个主要角色:
- Originator(发起人):需要保存其内部状态的对象,它定义一个创建备忘录的接口,并且可以使用备忘录恢复其内部状态。
- Memento(备忘录):用于存储发起人对象的内部状态,通常包含多个私有变量来存储状态信息,且提供有限的接口防止发起人以外的其他对象访问备忘录内容。
- Caretaker(管理者):负责保存备忘录对象,但不关心备忘录的内容,只是提供一个存储位置。
假设有一个文本编辑器,我们希望实现一个撤销操作。
2. 发起人类(Originator)
public class Editor {
private String content;
public void type(String text) {
content += text;
System.out.println("Typed: " + text);
}
public Memento save() {
return new Memento(content);
}
public void restore(Memento memento) {
content = memento.getContent();
System.out.println("Restored content: " + content);
}
public String getContent() {
return content;
}
}
3. 备忘录用类(Memento)
public class Memento {
private final String content;
public Memento(String content) {
this.content = content;
}
public String getContent() {
return content;
}
}
4. 管理者类(Caretaker)
public class Caretaker {
private Memento memento;
public void setMemento(Memento memento) {
this.memento = memento;
}
public Memento getMemento() {
return memento;
}
}
5.使用示例
public class Main {
public static void main(String[] args) {
Editor editor = new Editor();
Caretaker caretaker = new Caretaker();
editor.type("Hello, ");
System.out.println("Current content: " + editor.getContent());
caretaker.setMemento(editor.save());
editor.type("world!");
System.out.println("Current content: " + editor.getContent());
editor.restore(caretaker.getMemento());
}
}
备忘录模式是一种很好的处理对象状态恢复的模式,尤其适用于需要实现撤销/重做功能的场景,如文本编辑器、游戏进度存档等。它通过保存对象状态的快照,确保了在需要时能安全地恢复到之前的状态,同时保持了对象内部状态的封装性。然而,使用时需要权衡内存消耗和系统复杂度的增加,确保模式的合理应用。
6. 优点
- 简化恢复操作:通过保存和恢复对象的状态,简化了撤销操作的实现。
- 保持封装性:备忘录对象只暴露有限的接口,保护了发起人的内部状态不被外部直接访问。
- 支持多个状态回滚:可以保存多个备忘录,实现多次撤销操作。
7. 缺点
- 资源消耗:如果发起人对象的状态非常庞大,创建备忘录可能会消耗较多的内存资源。
- 类数量增加:引入了备忘录和管理者类,增加了系统的复杂度。