Книга GoF описывает этот паттерн как предоставляющий унифицированный интерфейс к множеству интерфейсов в некоторой подсистеме. Книга «Паттерны проектирования» дает это же толкование и обращает внимание, что, скрывая сложность подсистемы, паттерн «Фасад» в то же время предоставляет все возможности подсистемы через удобный для использования интерфейс.
Для простого практического примера того, как работает паттерн «Фасад», представьте стиральную машину со всего лишь двумя режимами стирки: для сильно загрязненного белья и для слабо загрязненного.
Для каждого режима стиральная машина должна выполнить предопределенный набор операций: установить температуру воды, нагреть воду, установить длительность цикла стирки, добавить стиральный порошок, добавить отбеливающее средство, добавить смягчитель ткани и т.д. Каждый режим требует различного набора инструкций по стирке (разное количество стирального порошка, более высокая/низкая температура, более долгий/короткий цикл отжима и т.д.).
Простой интерфейс предоставляет два режима стирки, скрывающих сложную логику выбора подходящей температуры воды, длительности отжима и цикла стирки, а также различные методики добавления стирального порошка, отбеливающего средства или смягчителя ткани.
Пользователь стиральной машины не должен думать о сложной логике стирки вещей (выбирать температуру, длительность цикла и т.д.). Единственное, что должен сделать пользователь — решить, сильно загрязнено белье или нет. В этом состоит сущность паттерна «Фасад» применительно к конструкции стиральных машин.
Паттерн «Фасад» обычно реализуется в следующих целях и случаях:
- для обеспечения простого и унифицированного доступа к унаследованной системе управления производством;
- для создания общедоступного API к таким классам, как драйвер;
- для предоставления крупно-модульного доступа к доступным сервисам. Сервисы сгруппированы как в вышеприведенном примере со стиральной машиной;
- чтобы снизить количество сетевых вызовов. Фасад выполняет множество обращений к подсистеме, в то время как удаленный клиент должен выполнить одно-единственное обращение к фасаду;
- для инкапсуляции последовательности выполняемых действий и внутренних деталей приложения, чтобы обеспечить простоту и безопасность.
Кстати, фасады также иногда реализуют как абстрактные фабрики-одиночки.
Диаграмма классов фасада. Как можно увидеть на диаграмме классов на рис.3.1, паттерн «Фасад» предоставляет простой интерфейс для базовой системы, инкапсулируя сложную логику.
Рис 3.1. Диаграмма классов паттерна «Фасад».