Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
!Шпора по ООПиП (3).docx
Скачиваний:
35
Добавлен:
22.09.2019
Размер:
2.31 Mб
Скачать

84. Фасад (шаблон проектирования)

Шаблон проектирования, позволяющий скрыть сложность системы путем сведения всех возможных внешних вызовов к одному объекту, делегирующему их соответствующим объектам системы.

Описание

Проблема

Как обеспечить унифицированный интерфейс с набором разрозненных реализаций или интерфейсов, например, с подсистемой, если нежелательно высокое связывание с этой подсистемой или реализация подсистемы может измениться?

Решение

Определить одну точку взаимодействия с подсистемой — фасадный объект, обеспечивающий общий интерфейс с подсистемой и возложить на него обязанность по взаимодействию с её компонентами. Фасад — это внешний объект, обеспечивающий единственную точку входа для служб подсистемы. Реализация других компонентов подсистемы закрыта и не видна внешним компонентам. Фасадный объект обеспечивает реализацию паттерна Устойчивый к изменениям (Protected Variations) с точки зрения защиты от изменений в реализации подсистемы.

Особенности применения

Шаблон применяется для установки некоторого рода политики по отношению к другой группе объектов. Если политика должна быть яркой и заметной, следует воспользоваться услугами шаблона Фасад. Если же необходимо обеспечить скрытность и аккуратность (прозрачность), более подходящим выбором является шаблон Заместитель (Proxy).

using System;

namespace Library

{

/// <summary>

/// Класс подсистемы

/// </summary>

/// <remarks>

/// <li>

/// <lu>реализует функциональность подсистемы;</lu>

/// <lu>выполняет работу, порученную объектом <see cref="Facade"/>;</lu>

/// <lu>ничего не "знает" о существовании фасада, то есть не хранит ссылок на него;</lu>

/// </li>

/// </remarks>

internal class SubsystemA

{

internal string A1()

{

return "Subsystem A, Method A1\n";

}

internal string A2()

{

return "Subsystem A, Method A2\n";

}

}

internal class SubsystemB

{

internal string B1()

{

return "Subsystem B, Method B1\n";

}

}

internal class SubsystemC

{

internal string C1()

{

return "Subsystem C, Method C1\n";

}

}

}

/// <summary>

/// Facade - фасад

/// </summary>

/// <remarks>

/// <li>

/// <lu>"знает", каким классами подсистемы адресовать запрос;</lu>

/// <lu>делегирует запросы клиентов подходящим объектам внутри подсистемы;</lu>

/// </li>

/// </remarks>

public static class Facade

{

static Library.SubsystemA a = new Library.SubsystemA();

static Library.SubsystemB b = new Library.SubsystemB();

static Library.SubsystemC c = new Library.SubsystemC();

public static void Operation1()

{

Console.WriteLine("Operation 1\n" +

a.A1() +

a.A2() +

b.B1());

}

public static void Operation2()

{

Console.WriteLine("Operation 2\n" +

b.B1() +

c.C1());

}

}

class Program

{

static void Main(string[] args)

{

Facade.Operation1();

Facade.Operation2();

// Wait for user

Console.Read();

}

}