Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шаблоны и архитектура программ.doc
Скачиваний:
12
Добавлен:
04.05.2019
Размер:
558.08 Кб
Скачать

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

Этот шаблон используется для захвата и сохранения внутреннего состояния объекта с возможностью дальнейшего восстановления состояния. Важной особенностью шаблона Хранитель является то, что он позволяет сохранить внутреннее состояние объекта без нарушения правил инкапсуляции.

Рис. 23. UML-диаграмма шаблона Хранитель.

На рис. 23 показана UML-диаграмма шаблона хранитель. Ниже описаны элементы диаграммы.

  • Составитель. Этот тот класс, состояние которого предполагается сохранять. Составитель включает метод CreateMemento(), который используется для генерации объекта-хранителя, содержащего состояние составителя. Также составитель содержит метод SetMemento(), восстанавливающий состояние по хранителю.

  • Хранитель. Объект-хранитель содержит информацию о состоянии Составителя. То, что содержит Хранитель, контролируется Составителем. Хранитель защищает сохраняемую информацию, предоставляя усеченный внешний интерфейс, не позволяющий эту информацию редактировать.

  • Смотритель. Класс Смотритель используется для хранения объектов-хранителей для дальнейшего использования. Смотритель используется только для хранения – он не просматривает и не изменяет внутренне состояние Хранителей. Смотритель может содержать как единичный объект-хранитель, так и коллекцию хранителей.

Рассмотрим пример реализации шаблона Хранитель. В примере описывается набор классов для поддержки функции Undo в библиотечной системе. Класс-составитель представляет информацию о книге, редактируемую пользователем. Если пользователь делает ошибку, он может выполнить операцию Undo для возврата книги в первоначальное состояние.

public class Book

{

private string _isbn;

private string _title;

private string _author;

private DateTime _lastEdited;

public string ISBN

{

get { return _isbn; }

set

{

_isbn = value;

SetLastEdited();

}

}

public string Title

{

get { return _title; }

set

{

_title = value;

SetLastEdited();

}

}

public string Author

{

get { return _author; }

set

{

_author = value;

SetLastEdited();

}

}

public Book()

{

SetLastEdited();

}

private void SetLastEdited()

{

_lastEdited = DateTime.UtcNow;

}

public Memento CreateUndo()

{

return new Memento(_isbn, _title, _author, _lastEdited);

}

public void RestoreFromUndo(Memento memento)

{

_title = memento.Title;

_author = memento.Author;

_isbn = memento.ISBN;

_lastEdited = memento.LastEdited;

}

public void ShowBook()

{

Console.WriteLine("{0} - '{1}' by {2}, edited {3}.",

ISBN, Title, Author, _lastEdited);

}

}

public class Memento

{

public string ISBN { get; private set; }

public string Title { get; private set; }

public string Author { get; private set; }

public DateTime LastEdited { get; private set; }

public Memento(string isbn, string title, string author,

DateTime lastEdited)

{

ISBN = isbn;

Title = title;

Author = author;

LastEdited = lastEdited;

}

}