- •Лабораторная работа №4 Шаблоны проектирования
- •Теоретические сведения
- •Отношения между классами. На диаграммах классов языка uml
- •Суть паттерна
- •Решение
- •Адаптер объектов
- •Адаптер классов
- •Адаптер классов не нуждается во вложенном объекте, так как он может одновременно наследовать и часть существующего класса, и часть сервиса.
- •Фасад (Facade)
- •Концептуальный пример
- •Program.Cs:
- •Output.Txt: Результат выполнения
- •Изолирует клиентов от компонентов подсистемы Уменьшая тем самым число объектов, с которыми клиентам приходится иметь дело, упрощая работу с подсистемой.
- •Позволяет ослабить связанность между подсистемой и ее клиентами.
- •Фасад не исключает возможности приложениям напрямую обращаться к классам подсистемы, если это необходимо.
- •Заместитель (Proxy)
- •3. Локальный запуск сервиса (удалённый прокси). Когда настоящий сервисный объект находится на удалённом сервере.
- •Концептуальный пример
- •Декоратор (Decorator)
- •// Объект
- •} //Ptr2 выходит из области видимости, но объект не //освобождается, потому что есть ptr, который по-прежнему //ссылается на него } //ptr выходит из области видимости, и объект уничтожается
- •Пример на языке c#
- •Порождающие шаблоны Абстрактная фабрика (Abstract Factory)
- •1. Шаблон реализуется созданием абстрактного класса Factory, который представляет собой интерфейс для создания компонентов системы.
- •3. Таким образом, еще раз - предоставляет интерфейс для создания семейств, связанных между собой, или зависимых объектов.
- •Клиент пользуется только интерфейсами, заданными в классах «Абстрактная фабрика» и «Абстрактный продукт».
- •Фабричный метод (Factory Method)
- •Void info() {
- •Void info() {
- •Void info() {
- •Int main()
- •Одиночка (Singleton) Суть паттерна
- •If(!p_instance)
- •Поведенческие шаблоны Стратегия (Strategy)
- •Стратегии построения пути.
- •Структура
- •Концептуальный пример
- •Program.Cs: Пример структуры паттерна
- •Output.Txt: Результат выполнения
- •Void useStrategy(void)
- •Void setStrategy(Strategy* o)
- •Int main(int /*argc*/, char* /*argv*/[])
- •Наблюдатель (Observer) Суть паттерна
- •Решение
- •Структура
- •Шаги реализации
- •Концептуальный пример
- •Program.Cs: Пример структуры паттерна
- •// Random.Next(…) - Метод, возвращает случайное целое число //в указанном диапазоне.
- •Output.Txt: Результат выполнения
- •Использование паттерна Observer
- •Команда (Command)
- •Структура
- •Output.Txt: Результат выполнения
- •Задания для лабораторной работы
Концептуальный пример
Этот пример показывает структуру паттерна Заместитель, а именно — из каких классов он состоит, какие роли эти классы выполняют и как они взаимодействуют друг с другом.
Program.cs: Пример структуры паттерна
using System;
namespace DesignPatterns.Proxy.Conceptual
{ // Интерфейс Субъекта объявляет общие операции как для
// Реального Субъекта, так и для Заместителя. Пока клиент
// работает с Реальным Субъектом, используя этот интерфейс, вы
// сможете передать ему заместителя вместо реального субъекта. public interface ISubject {
void Request ();
}
// Реальный Субъект содержит некоторую базовую бизнес-логику. Как
// правило, Реальные Субъекты способны выполнять некоторую
// полезную работу, которая к тому же может быть очень медленной
// или точной – например, коррекция входных данных. Заместитель
// может решить эти задачи без каких-либо изменений в коде
//Реального Субъекта.
class RealSubject: ISubject {
public void Request ()
{Console.WriteLine("RealSubject: Handling Request.");
// RealSubject: Обработка запроса.
}
}
// Интерфейс Заместителя идентичен интерфейсу Реального Субъекта.
class Proxy: ISubject
{
private RealSubject _realSubject;
public Proxy(RealSubject realSubject)
{
this._realSubject = realSubject;
}
// Наиболее распространёнными областями применения паттерна
// Заместитель являются ленивая загрузка, кэширование,
// контроль доступа, ведение журнала и т.д. Заместитель может
// выполнить одну из этих задач, а затем, в зависимости от
// результата, передать выполнение одноимённому методу в
// связанном объекте класса Реального Субъект.
public void Request ()
{
if (this.CheckAccess()) //проверка доступа
{
this._realSubject = new RealSubject();
this._realSubject.Request();
this.LogAccess (); //доступ к журналу
}
}
public bool CheckAccess ()
{
// Некоторые реальные проверки должны проходить здесь.
Console.WriteLine("Proxy: Checking access prior to firing a real request.");
//Прокси: Проверка доступа до запуска реального запроса.
return true;
}
public void LogAccess ()
{
Console.WriteLine("Proxy: Logging the time of request.");
//Прокси: Регистрация времени запроса
}
}
public class Client
{
// Клиентский код должен работать со всеми объектами (как с
// реальными, так и заместителями) через интерфейс Субъекта,
// чтобы поддерживать как реальные субъекты, так и
// заместителей. В реальной жизни, однако, клиенты в основном
// работают с реальными субъектами напрямую. В этом случае,
// для более простой реализации паттерна, можно расширить
// заместителя из класса реального субъекта.
public void ClientCode (ISubject subject)
{
// ...
subject.Request();
// ...
}
}
class Program
{
static void Main(string[] args)
{
Client client = new Client ();
Console.WriteLine("Client: Executing the client code with a real subject:");
// Клиент: Выполнение кода клиента с реальным объектом:"
RealSubject realSubject = new RealSubject ();
client.ClientCode(realSubject);
Console.WriteLine();
Console.WriteLine("Client: Executing the same client code with a proxy:");
// Клиент: Выполнение одного и того же кода клиента с помощью прокси:
Proxy proxy = new Proxy(realSubject);
client.ClientCode(proxy);
}
}
}
Output.txt: Результат выполнения
Client: Executing the client code with a realsubject:
RealSubject: Handling Request.
Client: Executing the same client code with a proxy:
Proxy: Checking access prior to firing a real request.
RealSubject: Handling Request.
Proxy: Logging the time of request.
Клиент: Выполнение клиентского кода с реальным объектом:
RealSubject: Обработка Запрос.
Клиент: Выполнение одного и того же кода клиента с помощью прокси:
Прокси: Проверка доступа до запуска реального запроса.
RealSubject: Обработка запроса.
Прокси: Регистрация времени запрос
