Design Patterns教程-备忘录模式
备忘录模式的定义是“在不违反封装的情况下,将对象恢复到之前的状态”。这种情况在发生错误或失败时非常有用。
备忘录模式也被称为Token。
撤销(Undo)或回退(Backspace)或Ctrl+Z是编辑器中最常用的操作之一。备忘录设计模式用于实现撤销操作。这是通过在对象改变状态时保存其当前状态来完成的。
优点:
- 它保持了封装边界。
- 它简化了发起者。
使用场景:
- 它用于大多数软件中的撤销和重做操作。
- 它也用于数据库事务。
备忘录模式的UML:
备忘录:
- 存储发起者对象的内部状态。状态可以包括任意数量的状态变量。
- 备忘录必须有两个接口,一个是给管理者的接口。这个接口不允许任何操作或访问备忘录存储的内部状态,从而维护封装。另一个接口是给发起者的,它允许发起者访问恢复先前状态所需的任何状态变量。
发起者(Originator):
- 创建一个备忘录对象,该对象将捕获发起者的内部状态。
- 使用备忘录对象恢复其之前的状态。
管理者(Caretaker):
- 负责保存备忘录。
- 备忘录对管理者是透明的,管理者不得对其进行操作。
备忘录模式的实现:
步骤 1:
创建一个Originator
类,该类将使用备忘录对象恢复其之前的状态。
// 这是一个类
public class Originator {
private String state;
public void setState(String state) {
this.state = state;
}
public String getState() {
return state;
}
public Memento saveStateToMemento() {
return new Memento(state);
}
public void getStateFromMemento(Memento memento) {
state = memento.getState();
}
}
步骤 2:
创建一个Memento
类,该类将存储发起者对象的内部状态。
// 这是一个类
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
步骤 3:
创建一个Caretaker
类,该类负责保存备忘录。
// 这是一个类
import java.util.ArrayList;
import java.util.List;
public class Caretaker {
private List<Memento> mementoList = new ArrayList<Memento>();
public void add(Memento state) {
mementoList.add(state);
}
public Memento get(int index) {
return mementoList.get(index);
}
}
步骤 4:
创建一个MementoPatternDemo
类。
// 这是一个类
public class MementoPatternDemo {
public static void main(String[] args) {
Originator originator = new Originator();
Caretaker careTaker = new Caretaker();
originator.setState("State #1");
careTaker.add(originator.saveStateToMemento());
originator.setState("State #2");
careTaker.add(originator.saveStateToMemento());
originator.setState("State #3");
careTaker.add(originator.saveStateToMemento());
originator.setState("State #4");
System.out.println("Current State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(0));
System.out.println("First saved State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(1));
System.out.println("Second saved State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(2));
System.out.println("Third saved State: " + originator.getState());
}
}
输出:
Current State: State #4
First saved State: State #1
Second saved State: State #2
Third saved State: State #3