ПКРПСиБД LAB2 Бычков А.С. (Лабораторная работа 2)
Описание файла
Файл "ПКРПСиБД LAB2 Бычков А.С." внутри архива находится в папке "Лабораторная работа 2". Документ из архива "Лабораторная работа 2", который расположен в категории "". Всё это находится в предмете "распределённые ис и базы данных" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "распределённые ис и базы данных" в общих файлах.
Онлайн просмотр документа "ПКРПСиБД LAB2 Бычков А.С."
Текст из документа "ПКРПСиБД LAB2 Бычков А.С."
Национальный исследовательский институт
Московский Энергетический Институт(Технический Университет)
Институт автоматики и вычислительной техники
Кафедра Прикладной математики
Лабораторная работа №2
по дисциплине:
Проектирование крупных распределенных программных систем и баз данных
тема: «Реализация шаблона проектирования»
Выполнил:
Бычков А.С.
Москва
2012 г.
Шаблон “IMMUTABLE OBJECT”
Категория
Фундаментальный
Описание
Неизменяемый объект - это объект, состояние которого не может измениться после создания.
Уместность применения
Данный шаблон следует применять, если нет необходимости в частом изменении данных объекта.
Преимущества, достигаемые при применении шаблона
1) Исключает необходимость синхронизации доступа при многопоточном программировании
2) Позволяет безопасно копировать ссылки на объект, а не сам объект
Недостатки
Т.к при любом изменении объекта заново выделяется память и создается его копия, то при частом изменении возможны высокие затраты памяти и времени выполнения программы. Например именно по этому при трудоемкой работе со строками их не используют на прямую а прибегают к помощи вспомогательных классов (например StringBuffer Для Java).
Реализация
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace patternsimpl
{
public class ImmutableUser
{
public readonly String mUserName;
public readonly DateTime mUserBirthday;
public ImmutableUser(String aUserName, DateTime aUserBirthday)
{
mUserName = aUserName;
mUserBirthday = aUserBirthday;
}
public ImmutableUser setUserName(String aUserName)
{
return new ImmutableUser(aUserName, mUserBirthday);
}
public ImmutableUser setUserBirthday(DateTime aBirthday)
{
return new ImmutableUser(mUserName, aUserBirthday);
}
}
}
UML-диаграмма
DELEGATION PATTERN
Категория
Поведенческий
Уместность применения
Шаблон даёт возможность изменить поведение конкретного экземпляра объекта вместо создания нового класса путем наследования. Таким образом, если при работе с объектом велика вероятность возникновения такой ситуации, следует использовать шаблон делегирования.
Преимущества, достигаемые при использовании этого шаблона
-
Легкость тестирования из за модульности
-
Более прозрачен для понимания
Недостатки шаблона
-
В некоторых случаях применение шаблона может вызвать неоправданное увеличение числа объектов в системе
Детали реализации
public interface IDesigner
{
void createDesign();
}
public class ProfessionalDesigner : IDesigner
{
public void createDesign()
{
Console.Out.WriteLine("Creating design....");
Thread.Sleep(3000);
Console.Out.WriteLine("Done!");
}
}
public class Freelancer : IDesigner
{
public Boolean isLowOnMoney = true;
public void createSite()
{
Console.Out.WriteLine("OK NOW I'M GONNA MAKE THIS BRILLIANT SITE");
createDesign();
createCode();
Console.Out.WriteLine("SITE IS FINALLY DONE");
}
public IDesigner hireDesigner()
{
if (isLowOnMoney)
{
return new HungryStudent();
}
else
{
return new ProfessionalDesigner();
}
}
public void createCode()
{
Console.Out.WriteLine("Started creating code");
System.Threading.Thread.Sleep(1500);
Console.Out.WriteLine("Done with coding");
}
public void createDesign()
{
hireDesigner().createDesign();
}
}
public class HungryStudent : IDesigner
{
public void createDesign()
{
Console.Out.WriteLine("Creating design....");
for (int i = 0; i < 4; i++)
{
System.Threading.Thread.Sleep(1000);
Console.Out.WriteLine("FAILED :(((");
}
Console.Out.WriteLine("WOOHO Done!");
}
}
UML-диаграммаклассов
MARKER INTERFACE
Категория шаблона
Фундаментальный
Описание
Маркерный интерфейс - интерфейс не содержащий ни одного метода.
Уместность применения
Данный шаблон используют, когда необходимо показать, что какая-то часть класса обладает особым поведением.
Примеры для Java: Serializable, Clonable, Remote;
Преимущества применения данного шаблона
Легко проверить объект на особое поведение с помощью (obj is IMarker);
Недостатки шаблона
Невозможно отменить маркер для подклассов
Реализация
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace patternsimpl
{
public interface IImmutableMarker
{
}
}
namespace patternsimpl
{
public class ImmutableUser : IImmutableMarker
{
public readonly String mUserName;
public readonly DateTime mUserBirthday;
public ImmutableUser(String aUserName, DateTime aUserBirthday)
{
mUserName = aUserName;
mUserBirthday = aUserBirthday;
}
public ImmutableUser setUserName(String aUserName)
{
return new ImmutableUser(aUserName, mUserBirthday);
}
public ImmutableUser setUserBirthday(DateTime aBirthday)
{
return new ImmutableUser(mUserName, aBirthday);
}
}
}
UML-диаграммаклассов
PROPERTY CONTAINER
Категория шаблона
Фундаментальный
Описание
Функция шаблона «Контейнер свойств» состоит в том, чтобы приложение, уже построенное и развернутое, могло динамически расширяться.
Уместность применения
Если разработчику неизвестно, что такое Map и Dictionary.
Преимущества применения данного шаблона
Применение шаблона позволяет расширять при необходимости классы приложения, добавляя в них дополнительные данные. Так, использование шаблона дает нам механизм для динамического расширения объекта свойствами во время выполнения.
Недостатки шаблона
В использовании шаблона Property Container имеется ряд недостатков. При встроенной реализации контейнера свойств теряется строгую типизацию. Также и интерфейс класса не полностью описывается в содержании и возможно потребуется модифицировать интерфейс пользователя, чтобы реализовать преимущества, полученные от добавленных атрибутов.
Реализация
public interface IPropertyContainer
{
String getProperty(String aKey);
void addProperty(String aKey, String aValue);
void removeProperty(String aKey);
String[] getKeyset();
}
public class Film : IPropertyContainer
{
public readonly String mName;
public readonly DateTime mRealeaseDate;
private Dictionary
public Film(String aName, DateTime aRealeaseDate)
{
mName = aName;
mRealeaseDate = aRealeaseDate;
}
public String getName()
{
return mName;
}
public DateTime getRealeaseDate()
{
return mRealeaseDate;
}
public void addProperty(String aKey, String aValue)
{
mProperties.Add(aKey, aValue);
}
public String getProperty(String aKey)
{
return mProperties[aKey];
}
public void removeProperty(String aKey)
{
mProperties.Remove(aKey);
}
public String[] getKeyset()
{
return mProperties.Keys.ToArray();
}
}
UML-диаграммаклассов
ТЕСТИРОВАНИЕ
class Test
{
public static void Main(string[] args)
{
testImmutable();
testIMarker();
testPropertyContainer();
testDelegationPattern();
Console.ReadLine();
}
public static void testIMarker()
{
Console.Out.WriteLine(">>>>TEST IMARKER<<<<<");
ImmutableUser user = new ImmutableUser("me", DateTime.Now);
Object someObject = new Object();
Console.Out.WriteLine(user is IImmutableMarker);
Console.Out.WriteLine(someObject is IImmutableMarker);
Console.Out.WriteLine();
}
public static void testImmutable()
{
Console.Out.WriteLine(">>>>TEST IMMUTABLE<<<<<");
ImmutableUser user = new ImmutableUser("me", DateTime.Now);
Console.Out.WriteLine("user name is " + user.mUserName + " and his birthday is " + user.mUserBirthday.ToShortDateString());
user = user.setUserName("not_me");
Console.Out.WriteLine("user name is " + user.mUserName + " and his birthday is " + user.mUserBirthday.ToShortDateString());
Console.Out.WriteLine();
}
public static void testPropertyContainer()
{
Console.Out.WriteLine(">>>>TEST PROPERTY CONTAINER<<<<<");
Film film = new Film("MyFilm", DateTime.Now);
film.addProperty("author", "great person");
film.addProperty("staring", "great actor");
Console.WriteLine("Film name is " + film.mName + " released in " + film.mRealeaseDate.ToShortDateString());
Console.WriteLine("============ADDITIONAL INFO===========");
foreach (String property in film.getKeyset())
{
Console.WriteLine(property + " ---> " + film.getProperty(property));
}
Console.Out.WriteLine();
}
public static void testDelegationPattern()
{
Console.Out.WriteLine(">>>>TEST DELEGATION<<<<<");
Freelancer freelancer = new Freelancer();
freelancer.createSite();
freelancer.isLowOnMoney = false;
freelancer.createSite();
}
}