概述
备忘录模式是一种行为设计模式,它提供了一种在不破坏封装性的前提下,捕获并外部化对象内部状态的能力。这样一来,对象可以在将来某个时刻恢复到之前的状态。这种模式非常适合需要实现撤销操作的场景,比如文本编辑器的撤销功能、游戏的存档与读档等。
目的
保存状态:允许对象将其当前状态保存起来,以便之后可以恢复。
保持封装性:确保状态的存储对其他对象不可见,以保护内部信息的安全。
支持撤销操作:简化实现撤销和重做功能的过程。
角色
Originator(发起人):负责创建和恢复备忘录的类。它定义了一个接口用以获取它的当前状态,并使用备忘录恢复其内部状态。
Memento(备忘录):用于存储Originator对象的内部状态。备忘录类可以原封不动地存储Originator对象的私有信息,但除了Originator自己之外,其他对象不能访问这些信息。
Caretaker(管理者):负责保存备忘录对象,但不能对备忘录的内容进行操作或直接访问。它只是提供了一个存储结构来持有备忘录对象。
实现步骤
定义Originator类:包含创建备忘录的方法(
createMemento()
)和恢复备忘录的方法(restoreMemento()
)。定义Memento类:存储Originator对象的状态信息。通常会根据实际情况选择将其属性设置为私有,以保证封装性。
定义Caretaker类:用来管理备忘录对象,通常是一个简单的容器类,不涉及备忘录内容的具体操作。
使用模式:在需要保存状态时,由Originator创建一个备忘录对象;Caretaker负责存储这个备忘录。当需要恢复状态时,Caretaker将备忘录传递给Originator,由Originator调用恢复方法进行状态恢复。
代码示例
// Memento类
class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
String getState() {
return state;
}
}
// Originator类
class Originator {
private String state;
public void setState(String state) {
this.state = state;
System.out.println("Originator: State set to " + state);
}
public Memento createMemento() {
return new Memento(state);
}
public void restoreMemento(Memento memento) {
state = memento.getState();
System.out.println("Originator: State restored to " + state);
}
public String getState() {
return state;
}
}
// Caretaker类
class Caretaker {
private Memento memento;
public void setMemento(Memento memento) {
this.memento = memento;
}
public Memento getMemento() {
return memento;
}
}
// 客户端代码
public class MementoPatternDemo {
public static void main(String[ ] args) {
Originator originator = new Originator();
originator.setState("State1");
Caretaker caretaker = new Caretaker();
caretaker.setMemento(originator.createMemento());
originator.setState("State2");
System.out.println("Current State: " + originator.getState());
originator.restoreMemento(caretaker.getMemento());
}
}
应用场景
当需要实现撤销/重做功能时。
需要保存和恢复对象的内部状态,但又不想暴露这些状态的细节时。
在不影响对象自身接口设计的情况下,提供一种灵活的状态恢复机制。
总结
备忘录模式通过将对象的状态封装在备忘录中,使得对象可以在不影响当前状态的情况下,灵活地回滚到之前的状态。它通过明确分离状态的备份与恢复责任,提高了软件的灵活性和可维护性。
评论区