Клиент запрашивает Memento (хранителя) у исходного объекта, когда ему необходимо сохранить состояние исходного объекта (установить контрольную точку). Исходный объект инициализирует Memento своим текущим состоянием. Клиент является "посыльным" за Memento, но только исходный объект может сохранять и извлекать информацию из Memento (Memento является "непрозрачным" для клиентов и других объектов). Если клиенту в дальнейшем нужно "откатить" состояние исходного объекта, он передает Memento обратно в исходный объект для его восстановления.
Паттерн проектирования Memento определяет трех различных участников:
Originator (хозяин) - объект, умеющий создавать хранителя, а также знающий, как восстановить свое внутреннее состояние из хранителя.
Caretaker (смотритель) - объект, который знает, почему и когда хозяин должен сохранять и восстанавливать себя.
Memento (хранитель) - "ящик на замке", который пишется и читается хозяином и за которым присматривает смотритель.
Паттерн проектирования Memento определяет трех различных участников:
Originator (хозяин) - объект, умеющий создавать хранителя, а также знающий, как восстановить свое внутреннее состояние из хранителя.
Caretaker (смотритель) - объект, который знает, почему и когда хозяин должен сохранять и восстанавливать себя.
Memento (хранитель) - "ящик на замке", который пишется и читается хозяином и за которым присматривает смотритель.
Ниже представлен пример реализации данного паттерна.
// "Хранитель"
var Memento = function (state) {
var state = state || 'undefined';
this.getState = function () {
return state;
};
};
// "Опекун"
var Caretaker = function () {
var memento;
this.getMemento = function () {
return memento;
};
this.setMemento = function (_memento) {
if (_memento instanceof Memento) {
memento = _memento;
}
};
};
// "Создатель"
var Originator = function () {
var state;
this.setState = function (_state) {
state = _state || "undefined";
};
this.getState = function () {
return state;
};
this.saveState = function () {
return new Memento(state);
};
this.restoreState = function (memento) {
if (memento instanceof Memento) {
state = memento.getState();
}
};
};
var Application = function () {
this.run = function () {
var originator = new Originator();
var caretaker = new Caretaker();
originator.setState('on');
console.log('State is ' + originator.getState());
caretaker.setMemento(originator.saveState());
originator.setState('off');
console.log('State is ' + originator.getState());
originator.restoreState(caretaker.getMemento());
console.log('State is ' + originator.getState());
};
};
var application = new Application();
application.run();
State is on
State is off
State is on
State is off
State is on