Лабораторная работа 2 (ПКРПСиБД 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<String, String> mProperties = new Dictionary<String, String>();

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();

}

}






Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.