Предоставляет унифицированный интерфейс к группе интерфейсов подсистемы. Фасад определяет высокоуровневый интерфейс, упрощающий работу с подсистемой.
В качестве примера используется система домашнего кинотеатра, состоящая из DVD-плеера, усилителя, проектора, экрана, освещения и аппарата для приготовления попкорна. У каждого устройства свой интерфейс. Чтобы посмотреть фильм нужно проделать ряд операций:
- Включить аппарат для попкорна.
- Запустить приготовление попкорна.
- Выключить свет.
- Опустить экран.
- Включить проектор.
- Связать вход проектора с выходом DVD.
- Включить широкоформатный режим на проекторе.
- Включить усилитель.
- Связать вход усилителя с выходом DVD.
- Включить на усилителе режим окружающего звука.
- Установить на усилителе нужную громкость.
- Включить DVD-проигрыватель.
- Включить воспроизведение на DVD-проигрывателе.
Для выключение необходимо проделать примерно такой же объем операций.
В данном примере фасад реализует всего два метода: WatchMovie и EndMovie. В фасад встраиваются все компоненты подсистемы, а в WatchMovie и EndMovie вызываются необходимые методы встроенных компонентов.
Таким образом, для просмотра фильма клиенту не нужно вызывать целый список методов, а нужно вызвать лишь один метод фасада. Клиент перестает зависеть от каждого компонентна системы, а начинает зависеть лишь от фасада. Это позволяет спокойно менять компоненты, не меняя при этом код клиента. Вместе с этим, сама система все еще доступна на более низком уровне, чтоб иметь возможность производить более точную настройку.
- Если понадобится упростить большой интерфейс или семейство сложных интерфейсов - используйте фасад.
- Фасад изолирует клиента от сложной подсистемы.
- Реализация фасада основана на композиции и делегировании.
- Для подсистемы можно реализовать несколько фасадов.