这里是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
方法)。