Хранитель (Memento) :: Cетевой уголок Majestio

Хранитель (Memento)


Хранитель — это поведенческий паттерн проектирования, который позволяет сохранять и восстанавливать прошлые состояния объектов, не раскрывая подробностей их реализации.

Применимость

Подробнее на 👉 refactoring.guru

UML-диаграмма

Пример реализации

#include <iostream>

// Memento

class Memento {
 private:
  std::string state;

 public:
  Memento(const std::string& state) : state(state) {}

  std::string getState() const { return state; }
};

// Оригинатор

class Originator {
 private:
  std::string state;

 public:
  void setState(const std::string& state) { this->state = state; }

  std::string getState() const { return state; }

  Memento createMemento() const { return Memento(state); }

  void restoreMemento(const Memento& memento) { state = memento.getState(); }
};

// Caretaker

class Caretaker {
 private:
  Memento memento;

 public:
  Caretaker(const Memento& memento) : memento(memento) {}

  void saveState(const Originator& originator) {
    memento = originator.createMemento();
  }

  void restoreState(Originator& originator) {
    originator.restoreMemento(memento);
  }
};

// Клиентский код

int main() {
  Originator originator;
  Memento memento("Состояние 1");
  Caretaker caretaker(memento);

  originator.setState("Состояние 2");
  std::cout << "Текущее состояние оригинатора: " << originator.getState() << std::endl;

  caretaker.restoreState(originator);
  std::cout << "Восстановленное состояние оригинатора: " << originator.getState() << std::endl;

  return 0;
}
Будет напечатано:
Текущее состояние оригинатора: Состояние 2
Восстановленное состояние оригинатора: Состояние 1
class Memento {
  final String state;

  Memento(this.state);
}

class Originator {
  String state;

  Originator(this.state);

  Memento createMemento() {
    return Memento(state);
  }

  void restoreMemento(Memento memento) {
    state = memento.state;
  }
}

class Caretaker {
  late Memento memento;

  void saveState(Originator originator) {
    memento = originator.createMemento();
  }

  void restoreState(Originator originator) {
    originator.restoreMemento(memento);
  }
}

void main() {
  var originator = Originator('Состояние 1');
  var caretaker = Caretaker();
  caretaker.saveState(originator);
  originator.state = 'Состояние 2';
  print('Текущее состояние оригинатора: ${originator.state}');
  caretaker.restoreState(originator);
  print('Восстановленное состояние оригинатора: ${originator.state}');
}
Будет напечатано:
Текущее состояние оригинатора: Состояние 2
Восстановленное состояние оригинатора: Состояние 1
Рейтинг: 0/5 - 0 голосов