Хранитель (шаблон проектирования): различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Описание: уточнение
Строка 44: Строка 44:
== Примеры реализации ==
== Примеры реализации ==


Первый вариант шаблона:
=== Стандартный вариант шаблона на PHP5 ===
{{Hider_hiding
| title = Исходный текст на языке [[PHP5]]
| content =
<source lang="php">
<?php

/*
* Паттерн хранитель, используется для хранения и восстановления состояния объекта
*/
namespace Memento {

/**
* Класс поддерживаюший сохранение состояний внутреннего состояния
*/
class Originator {

private $state;

public function setState($state) {
$this->state = $state;
echo sprintf("State setted %s\n", $this->state);
}

public function getState() {
return $this->state;
}

/**
* Создать снимок состояния объекта
* @return Memento
*/
public function CreateMemento() {
return new Memento($this->state);
}

/**
* Восстановить состояние
* @param \Memento\Memento $memento
*/
public function setMemento(Memento $memento) {
echo sprintf("Restoring state...\n");
$this->state = $memento->getState();
}

}

/**
* Хранитель состояния
*/
class Memento {

private $state;

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

public function getState() {
return $this->state;
}

}

/**
* Смотрящий за состоянием объекта
*/
class Caretaker {

private $memento;

public function getMemento() {
return $this->memento;
}

public function setMemento(Memento $memento) {
$this->memento = $memento;
}

}

$originator = new Originator();
$originator->setState("On");

// Store internal state
$caretaker = new Caretaker();
$caretaker->setMemento($originator->CreateMemento());

// Continue changing originator
$originator->setState("Off");

// Restore saved state
$originator->setMemento($caretaker->getMemento());
}
</source>
}}

===Первый вариант шаблона С#:===
{{Hider_hiding
| title = Исходный текст на языке [[С#]]
| content =
<source lang="csharp">
<source lang="csharp">
//This structural code demonstrates the Memento pattern which temporary saves and restores another object's internal state.
//This structural code demonstrates the Memento pattern which temporary saves and restores another object's internal state.
Строка 157: Строка 259:
State = On
State = On


</source>
</source>}}



=== C# ===
=== C# ===
{{Hider_hiding
| title = Исходный текст на языке [[С#]]
| content =
<source lang="csharp">
<source lang="csharp">
using System;
using System;
Строка 270: Строка 376:
}
}
}
}
</source>
</source>}}


Нестандартный вариант шаблона:
===Нестандартный вариант шаблона:===
{{Hider_hiding
| title = Исходный текст на языке [[С#]]
| content =
<source lang="csharp">
<source lang="csharp">
public interface IOriginator
public interface IOriginator
Строка 478: Строка 587:
}
}
}
}
</source>
</source>}}


== Ссылки ==
== Ссылки ==

Версия от 20:24, 21 октября 2012

Хранитель
Memento
Тип поведенческий
Описан в Design Patterns Да

Хранитель (также известный как Memento, Token, Лексема)поведенческий шаблон проектирования.

Позволяет, не нарушая инкапсуляцию, зафиксировать и сохранить внутреннее состояния объекта так, чтобы позднее восстановить его в этом состоянии.

Существует два возможных варианта реализации данного шаблона: классический, описанный в книге Design Patterns, и реже встречаемый нестандартный вариант.

Применение

Шаблон Хранитель используется, когда:

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

Структура

Классический вариант:

UML диаграмма, описывающая классический вариант шаблона Хранитель

Нестандартный вариант:

UML диаграмма, описывающая нестандартный вариант шаблона Хранитель
  • Originator - "Создатель"
  • Caretaker - "Опекун"
  • Memento - "Хранитель"

Описание

Классический вариант: Шаблон Хранитель используется двумя объектами: "Создателем" (originator) и "Опекуном" (caretaker). "Создатель" - это объект, у которого есть внутреннее состояние. Объект "Опекун" может производить некоторые действия с "Создателем", но при этом необходимо иметь возможность откатить изменения. Для этого "Опекун" запрашивает у "Создателя" объект "Хранителя". Затем выполняет запланированное действие (или последовательность действий). Для выполнения отката "Создателя" к состоянию, которое предшествовало изменениям, "Опекун" возвращает объект "Хранителя" его "Создателю". "Хранитель" является непрозрачным (т.е. таким, который не может или не должен изменяться "Опекуном").

Нестандартный вариант: Отличие данного варианта от классического заключено в более жёстком ограничении на доступ "Опекуна" к внутреннему состоянию "Создателя". В классическом варианте у "Опекуна" есть потенциальная возможность получить доступ к внутренним данным "Создателя" через "Хранителя", изменить состояние и установить его обратно "Создателю". В данном варианте "Опекун" обладает возможностью лишь восстановить состояние "Хранителя", вызвав Restore. Кроме всего прочего, "Опекуну" не требуется владеть связью на "Хранителя", чтобы восстановить его состояние. Это позволяет сохранять и восстанавливать состояние сложных иерархических или сетевых структур (состояния объектов и всех связей между ними) путём сбора снимков всех зарегистрированных объектов системы.

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

Стандартный вариант шаблона на PHP5

Первый вариант шаблона С#:


C#

Нестандартный вариант шаблона:

Ссылки