因此,这里是 Memento 模式的典型实现(跳过的 getter 和 setter)。
public class Employee {
private String name;
private String phone;
public EmployeeMemento save() {
return new EmployeeMemento(name, phone);
}
public void revert(EmployeeMemento memento) {
this.name = memento.getName();
this.phone = memento.getPhone();
}
}
public class EmployeeMemento {
private final String name;
private final String phone;
public EmployeeMemento(String name, String phone) {
this.name = name;
this.phone = phone;
}
}
public class Caretaker {
private Stack<EmployeeMemento> history;
public Caretaker() {
history = new Stack<>();
}
public void save(Employee employee) {
history.push(employee.save());
}
public void revert(Employee employee) {
employee.revert(history.pop());
}
}
我发现的这种模式的所有实现都或多或少等于上面的那个。但是这种实现存在一些问题,我不喜欢:
- 可以同时触发
employee.revert()
和caretaker.revert(employee)
。我希望只有一个接入点。 - 如果我们想更改 EmployeeMemento,我们还必须在 Employee 类中进行更改(因为
revert
方法)。
有没有办法克服这个问题?又或者是我太注意了,这个细节没那么重要?