Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Design Patterns by D.pdf
Скачиваний:
26
Добавлен:
19.02.2016
Размер:
2.57 Mб
Скачать

Facade — Фасад

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

Структура

Проблема

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

Решение

Определить одну точку взаимодействия с подсистемой — фасадный объект, обеспечивающий общий интерфейс с подсистемой и возложить на него обязанность по взаимодействию с её компонентами. Фасад

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

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

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

54

Пример реализации 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()

55

{

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

}

}

56

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]