Хранитель

Аналогія

Як приклад можна навести калькулятор ("творець"), у якого будь-яка остання виконана операція зберігається в пам'яті ("хранитель"), щоб ви могли знову викликати її за допомогою якихось кнопок ("опікун").

Стисло

Шаблон «Зберігач» фіксує та зберігає поточний стан об'єкта, щоб він легко відновлювався.

Вікіпедія

Шаблон "Зберігач" дозволяє відновлювати об'єкт у його попередньому стані (скасування через відкат - undo via rollback). Зазвичай шаблон застосовується, коли необхідно реалізувати функціональність скасування операції.

Приклад

Текстовий редактор іноді зберігає свій стан, щоб можна було відновити текст у якомусь минулому вигляді.

Спочатку створимо об'єкт «охоронець», у якому можна зберігати стан редактора.

class EditorMemento
{
    protected $content;

    public function __construct(string $content)
    {
        $this->content = $content;
    }

    public function getContent()
    {
        return $this->content;
    }
}

Тепер зробимо редактор («творець»), який використовуватиме об'єкт «охоронець».

class Editor
{
    protected $content = '';

    public function type(string $words)
    {
        $this->content = $this->content . ''. $words;
    }

    public function getContent()
    {
        return $this->content;
    }

    public function save()
    {
        return new EditorMemento($this->content);
    }

    public function restore(EditorMemento $memento)
    {
        $this->content = $memento->getContent();
    }
}

Використання:

$ editor = новий Editor ();

// Пишемо щось
$editor->type('This is the first sentence.');
$editor->type('This is second.');

// Збереження стану в: This is the first sentence. This is second.
$saved = $editor->save();

// Пишемо ще
$editor->type('And this is third.');

// Output: Вміст до збереження
echo $editor->getContent(); // This is the first sentence. This is second. And this is third.

// Відновлюємо останній збережений стан
$editor->restore($saved);

$editor->getContent(); // This is the first sentence. This is second.