ПКРПСиБД LAB6 Машеров Д.Е. (Лабораторная работа 6), страница 2
Описание файла
Файл "ПКРПСиБД LAB6 Машеров Д.Е." внутри архива находится в папке "Лабораторная работа 6". Документ из архива "Лабораторная работа 6", который расположен в категории "". Всё это находится в предмете "распределённые ис и базы данных" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "распределённые ис и базы данных" в общих файлах.
Онлайн просмотр документа "ПКРПСиБД LAB6 Машеров Д.Е."
Текст 2 страницы из документа "ПКРПСиБД LAB6 Машеров Д.Е."
Уместность применения
Может потребоваться добавить к некоторому объекту дополнительную функциональность, которая будет выполняться до, после или даже вместо основной функциональности объекта.
Преимущества, достигаемые при применении шаблона
Шаблон позволяет:
-
динамически и прозрачно для клиента изменять функциональность объекта;
-
реализовать небольшую функциональность, которая в дальнейшем может быть исключена;
-
уменьшить число классов, получающихся в результате использования наследования;
-
добавить функциональность классу, от который невозможно наследоваться;
-
реализовать аналог множественного наследования, в языках его не поддерживающих.
Недостатки шаблона
Использование декоратора может привести к системе с множеством мелких объектов, которые будут выглядеть похоже для разработчика, и появится сложность поддержки системы. Кроме того, декоратор и его закрытые компоненты неидентичны, поэтому тесты на принадлежность типа (instanceof) буду неуспешны.
Детали реализации
Component.cs
abstract class Component
{
protected int value;
public int Value
{
get {return value;}
}
public abstract int Operation();
}
ConcreteComponent.cs
class ConcreteComponent : Component
{
public ConcreteComponent(int value)
{
this.value = value;
}
public override int Operation()
{
return value * value;
}
}
Decorator.cs
class Decorator : Component
{
protected Component component;
public Component Component
{
get { return component; }
set { component = value; }
}
public override int Operation()
{
return component.Operation();
}
}
DecoratorA.cs
class DecoratorA : Decorator
{
string state;
public DecoratorA(string state)
{
this.state = state;
}
public int Operation()
{
return component.Operation() * component.Operation();
}
}
DecoratorB.cs
class DecoratorB : Decorator
{
public int Operation()
{
return component.Operation() * component.Operation() * component.Operation();
}
}
Программа:
static void Main(string[] args)
{
ConcreteComponent c = new ConcreteComponent(2);
DecoratorA decoratorA = new DecoratorA("qwerty");
DecoratorB decoratorB = new DecoratorB();
decoratorA.Component = c;
decoratorB.Component = decoratorA;
Console.WriteLine(decoratorB.Operation());
Console.Read();
}
UML-диаграмма
Диаграмма классов:
Диаграмма последовательности
Литература
-
http://ru.wikipedia.org/wiki/Декоратор_(шаблон_проектирования)
-
http://andrey.moveax.ru/patterns/oop/structural/decorator/
-
http://java.dzone.com/articles/design-patterns-decorator
Фасад
Категория: Структурные шаблоны
Описание
Представляет унифицированный интерфейс вместо набора интерфейсов некоторой подсистемы. Фасад определяет интерфейс более высокого уровня, который упрощает использование подсистемы.
Уместность применения
Шаблон следует применять, если:
-
Необходимо предоставить простой интерфейс к сложной подсистеме
-
Между клиентами и классами реализации существует много зависимостей
-
Необходимо разделить систему на различные «слои»
Преимущества, достигаемые при применении шаблона
Данный шаблон:
-
Изолирует клиентов от компонентов подсистемы, уменьшая тем самым число объектов, с которыми клиентам приходится иметь дело, и упрощая работу с подсистемой
-
Позволяет ослабить связанность между подсистемой и ее клиентами
-
Не препятствует приложениям напрямую обращаться к классам подсистемы, если это необходимо. Это позволяет достигать компромисса между простотой и общностью
Недостатки шаблона
В случае, если фасад является единственной точкой доступа к подсистеме, он может ограничивать доступ к функциям подсистемы и лишать взаимодействие гибкости.
Детали реализации
Subsystems.cs
class InputSystem
{
public int input()
{
Console.WriteLine("Введите число");
return Convert.ToInt16(Console.ReadLine());
}
}
class CalcSystem
{
public int Add(int x, int y)
{
return x + y;
}
}
class OutputSystem
{
public void output(int x)
{
Console.WriteLine("Результат: " + x);
Console.Read();
}
}
Facade.cs
class Facade
{
static InputSystem input;
static CalcSystem calc;
static OutputSystem output;
public Facade()
{
input = new InputSystem();
calc = new CalcSystem();
output = new OutputSystem();
}
public int Input()
{
return input.input();
}
public int Add(int x, int y)
{
return calc.Add(x,y);
}
public void Output(int x)
{
output.output(x);
}
}
Программа:
static void Main(string[] args)
{
Facade facade = new Facade();
int x = facade.Input();
int y = facade.Input();
x = facade.Add(x, y);
facade.Output(x);
}
UML-диаграмма
Диаграмма классов:
Диаграмма последовательности
Литература
-
Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. Приемы объектно-ориентированного проектирования. Паттерны проектирования. — СПб: Питер, 2001. — 368 с.: ил. (Серия «Библиотека программиста»)
Приспособленец
Категория: Структурные шаблоны
Описание
Приспособленец - это экземпляр объекта, который выдает себя за группу самостоятельных экземпляров.
Уместность применения
-
В приложении используется большое число объектов и из-за этого накладные расходы на хранение высоки.
-
Большую часть состояния объектов можно вынести вовне (в ответственность клиентов, которые создают и используют эти объекты). Многие группы объектов можно заменить относительно небольшим количеством разделяемых объектов, поскольку внешнее состояние вынесено.
-
Приложение не зависит от идентичности объекта. Поскольку объекты-приспособленцы могут разделяться, то проверка на идентичность возвратит истину для «концептуально» различных объектов (внутреннее состояние объектов же не меняется). Ключевой момент в том, что когда эти объекты запускают свои функции, то с учетом переданной от клиента информации (внешнего состояния) – результат выполнения получения совсем не идентичен другим
Преимущества, достигаемые при применении шаблона
Позволяет эконмить память за счет:
-
Уменьшается общее число экземпляров.
-
Сокращется объем памяти, необходимый для хранения внутреннего состояния.
-
Внешнее состояни вычисляется, а не хранится.
Недостатки шаблона
Увеличивается сложность, за счет того, что приходится управлять не используемым совместно состонянием внешне.
Детали реализации
Plane.cs
class Plane
{
protected string type;
protected int wingspan;
protected int capacity;
protected int speed;
protected int range;
protected int assetNumber;
public void Display(int assetNumber)
{
this.assetNumber = assetNumber;
Console.WriteLine(assetNumber + " " + type + ": " + Environment.NewLine +
" wingspan: " + wingspan + Environment.NewLine +
" capacity: " + capacity + Environment.NewLine +
" speed: " + speed + Environment.NewLine +
" range:" + range);
}
}
Planes.cs
class Boeing797 : Plane
{
public Boeing797()
{
type = "Boeing797";
wingspan = 80;
capacity = 1000;
speed = 1046;
range = 14400;
}
}
class Airbus380 : Plane
{
public Airbus380()
{
type = "Airbus380";
wingspan = 790;
capacity = 555;
speed = 912;
range = 10370;
}
}
PlaneFactory.cs
class PlaneFactory
{
Dictionary
public Plane GetPlane(string type)
{
Plane plane;
if (!planes.TryGetValue(type,out plane))
{
switch (type)
{
case "Boeing797": plane = new Boeing797(); break;
case "Airbus380": plane = new Airbus380(); break;
}
planes.Add(type, plane);
}
return plane;
}
}
Программа:
static void Main(string[] args)
{
PlaneFactory pf = new PlaneFactory();
List
int assetNumber = 10001;
foreach (string type in planes)
{
assetNumber++;
Plane plane = pf.GetPlane(type);
plane.Display(assetNumber);
}
Console.Read();
}
}
UML-диаграмма
Диаграмма классов:
Диаграмма последовательности
Литература
-
http://codelab.ru/pattern/flyweight/
-
http://groovy.codehaus.org/Flyweight+Pattern
-
http://ru.wikipedia.org/wiki/Flyweight
Заместитель
Категория: Структурные шаблоны
Описание
Заместитель (Proxy) - шаблон проектирования, который предоставляет объект, который контролирует доступ к другому объекту, перехватывая все вызовы
В зависимости от цели использования можно выделить следующие типы Прокси:
-
Удаленный прокси (Remote proxy) – обеспечивает взаимодействие с объектом в другом адресном пространстве. Это может быть как другое приложение на текущем компьютере, так и компонент на интернет сервере. При этом клиент обращается к объекту как к локальному, не замечая различий.
-
Виртуальный прокси (Virtual proxy) – выполняет оптимизацию доступа к объекту, может самостоятельно обрабатывать некоторые запросы. Например, создание ресурсоёмких объектов только при абсолютной необходимости в них. Другим характерным примером может служить кэширование, в результате которого Прокси сам может отвечать на часть запросов.
-
Защищающий прокси (Protection proxy) – управляет объектом, разграничивая права доступа различных клиентов.
-
Умная ссылка (Smart reference) – обеспечивает выполнение дополнительных действий при вызове методов объекта. Примерами могут служить подсчет ссылок или обеспечение потокобезопасности работы с объектом.
Уместность применения
Шаблон применяется, если:
-
работа с объектом не должна зависеть от того, где он реально расположен (от адресного пространства приложения до удаленного сервера);
-
нужно выполнять определенные действия при доступе к объекту;
-
необходимо оптимизировать взаимодействие объекта с клиентом.
Преимущества, достигаемые при применении шаблона
-
Упрощяет и оптимизирует взаимодействие с объектом, скрывая несущественные для конкретной задачи подробности реализации.
-
Прозрачен для клиента, поскольку предоставляет тот же интерфейс, что и замещаемый объект.
Недостатки шаблона
-
Уменьшается эффективность, посольку клиент обращается к объекту ненапрямую
Детали реализации
IMath.cs
class Plane
interface IMath
{
double Add(double x, double y);
double Sub(double x, double y);