Итак, вот типичная реализация паттерна Memento (геттеры и сеттеры пропущены).
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
).
Есть ли способ преодолеть это? А может я слишком много внимания уделяю, и эти детали не так важны?