Javascript. Memento pattern

Memento (хранитель) - поведенческий шаблон проектирования, позволяющий, не нарушая инкапсуляцию, зафиксировать и сохранить внутреннее состояния объекта так, чтобы позднее восстановить его в это состояние.

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