ПКРПСиБД LAB4 Буренков С. (Лабораторная работа 4)
Описание файла
Файл "ПКРПСиБД LAB4 Буренков С." внутри архива находится в папке "Лабораторная работа 4". Документ из архива "Лабораторная работа 4", который расположен в категории "". Всё это находится в предмете "распределённые ис и базы данных" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "распределённые ис и базы данных" в общих файлах.
Онлайн просмотр документа "ПКРПСиБД LAB4 Буренков С."
Текст из документа "ПКРПСиБД LAB4 Буренков С."
Национальный исследовательский университет
«Московский энергетический институт»
Лабораторная работа №4
По курсу «Проектирование крупных распределенных программных систем и баз данных »
Реализация одного из поведенческих шаблонов проектирования
Выполнил студент
группы А-13-08
Буренков Сергей
Проверил
доц., к.т.н. Куриленко
Иван Евгеньевич
Москва, 2012 год
Оглавление
Хранитель (Memento, Token) 3
Описание 3
Уместность применения 3
Преимущества 3
Недостатки 3
Детали реализации 3
UML-диаграммы 6
Литература 8
Хранитель (Memento, Token)
поведенческий шаблон проектирования
Описание
Позволяет, не нарушая инкапсуляцию, зафиксировать и сохранить внутреннее состояния объекта так, чтобы позднее восстановить его в этом состоянии.
Шаблон Хранитель используется двумя объектами: "Создателем" и "Опекуном". "Создатель" - это объект, у которого есть внутреннее состояние. Объект "Опекун" может производить некоторые действия с "Создателем", но при этом необходимо иметь возможность откатить изменения. Для этого "Опекун" запрашивает у "Создателя" объект "Хранителя". Затем выполняет запланированное действие (или последовательность действий). Для выполнения отката "Создателя" к состоянию, которое предшествовало изменениям, "Опекун" возвращает объект "Хранителя" его "Создателю". "Хранитель" является непрозрачным (т.е. таким, который не может или не должен изменяться "Опекуном").
Уместность применения
Шаблон «Хранитель» используется, как правило, когда:
-
необходимо сохранить снимок состояния объекта (или его части) для последующего восстановления;
-
прямой интерфейс получения состояния объекта раскрывает детали реализации и нарушает инкапсуляцию объекта.
Преимущества
Не раскрывается информация, которая доступна только "Хозяину", упрощается структура "Хозяина".
Недостатки
С использованием "Хранителей" могут быть связаны значительные издержки, если "Хозяин" должен копировать большой объём информации, или если копирование должно проводиться часто.
Детали реализации
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace lab4
{
public interface IBankAccount
{
object getSavePoint();
void setSavePoint(object point);
}
public class BankAccount : IBankAccount
{
public int numbLastTrans { get; set; }
public int balance { get; set; }
public BankAccount(int NumbLastTrans = 0, int Balance = 0)
{
this.balance = Balance;
this.numbLastTrans = NumbLastTrans;
}
public void Print()
{
Console.WriteLine("=======================");
Console.WriteLine("Последняя успешно завершенная транзакция: {0}", this.numbLastTrans);
Console.WriteLine("Ваш баланс: {0}", this.balance);
Console.WriteLine("=======================");
}
object IBankAccount.getSavePoint()
{
return new SavePoint { numbLastTrans = this.numbLastTrans, balance = this.balance };
}
void IBankAccount.setSavePoint(object savepoint)
{
if (Object.ReferenceEquals(savepoint, null))
throw new ArgumentNullException("savepoint is null");
if (!(savepoint is SavePoint))
throw new ArgumentException("savepoint is not SavePoint");
numbLastTrans = ((SavePoint)savepoint).numbLastTrans;
balance = ((SavePoint)savepoint).balance;
}
}
class SavePoint
{
public int numbLastTrans { get; set; }
public int balance { get; set; }
}
public class Saver
{
private object savepoint;
public void SaveState(IBankAccount bankaccount)
{
if (bankaccount == null)
throw new ArgumentNullException("bankaccount");
savepoint = bankaccount.getSavePoint();
}
public void RestoreState(IBankAccount bankaccount)
{
if (bankaccount == null)
throw new ArgumentNullException("bankaccount");
if (savepoint == null)
throw new InvalidOperationException("bankaccount == null");
bankaccount.setSavePoint(savepoint);
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Создан банковский счет");
BankAccount myAccount = new BankAccount();
Saver saver = new Saver();
saver.SaveState(myAccount);
myAccount.Print();
Console.ReadKey();
Random rand = new Random();
int sum = 0, p = 0;
for (int i = 1; i <= 5; i++)
{
sum = rand.Next(10000) - 5000;
myAccount.numbLastTrans = i;
myAccount.balance += sum;
Console.WriteLine("Готовится к выполнению банковская операция");
Console.WriteLine("Номер операции : {0}, сумма : {1} руб.", i, sum);
Console.ReadKey();
p = rand.Next(10);
if (p % 2 == 0)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Финансовая операция проведена успешно");
Console.ResetColor();
saver.SaveState(myAccount);
}
else
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("При выполнении финансовой операции произошел сбой");
Console.ResetColor();
saver.RestoreState(myAccount);
Console.WriteLine("Баланс после восстановления:");
}
myAccount.Print();
Console.ReadKey();
}
}
}
}
UML-диаграммы
Литература
-
Хранитель (шаблон проектирования) – [Электронный ресурс] – ru.wikipedia.org/wiki/Хранитель_(шаблон_проектирования)
-
Обзор паттернов проектирования – [Электронный ресурс] – http://citforum.ru/SE/project/pattern/p_2.shtml#3.2.10