Шаблон Фасад объединяет группу объектов в рамках одного специализированного интерфейса и переадресует вызовы его методов к этим объектам.
Шаблон используется если необходимо:
- упростить доступ к сложной системе;
- (или) создать различные уровни доступа к системе;
- (или) уменьшить число зависимостей между системой и клиентом.
Прежде всего необходимо утончить, что интерфейс, который предоставляет шаблон, не является суммой всех методов объектов, входящих в систему. Создание такой обобщенной версии приведет к появлению "божественного интерфейса". Т.е. интерфейса с огромным числом методов, без четко выраженной цели и порождающего большое количество зависимостей. В итоге – прямо противоположный шаблону результат.
Назначение Фасада – создать интерфейс, содержащий методы для решения определённой задачи или предоставляющий определённую абстракцию исходной системы. При этом возможно следующее:
- переадресация вызовов интерфейса шаблона объектам системы;
- уменьшение числа параметров метода подстановкой заранее определенных значений;
- создание новых методов, которые объединяют вызовы объектов системы и/или добавляют свою логику;
- часть исходных методов и свойств будут недоступны через Фасад, т.к. не играют роли для решения поставленной задачи.
Такой подход упрощает использование сложной системы. Одновременно это понижает количество вызываемых методов и общее число их вызовов. В итоге – уменьшение числа зависимостей в приложении.
Важно отметить, что Фасад не требует скрывать используемые системой объекты. Но есть одно важное условие: клиентская часть, для которой создавался интерфейс Фасада, должна использовать только его и не обращаться к объектам системы напрямую. Это способствует более точному отражению задачи клиента в интерфейсе.
Кроме того, система может предоставить несколько Фасадов для решения различного рода задач. Это позволяет создать несколько уровней абстракции, который могут быть как одна над другой, так и находиться в одной плоскости. Клиенты могут или использовать определенный Фасад для свой работы, или работать с конкретными объектами напрямую.
Интересен вариант совместного использования шаблонов Фасад и Абстрактной фабрики. В этом случае интерфейс Фасада связан не с самими объектами, а с их интерфейсами. Это скрывает реализацию и дает Абстрактной фабрике возможность изменять ее. Такой подход можно встретить, например, когда система использует платформенно- или аппаратно-зависимые классы.
Реализация шаблона в общем виде
- определяем функции выделяемой задачи или новой абстракции;
- согласуем их с существующими объектами в системе;
- разрабатываем интерфейс шаблона IFacade;
- реализуем IFacade в одном из вариантов:отдельный класс, переадресовывающего вызовы к объектам системы;
в классе самой системы; - клиент, вместо взаимодействия с несколькими классами, работает с одним новым интерфейсом.
Пример реализации
За пример возьмем примитивную работу маркетплейса.
Для начала создадим класс ProviderCommunication, выступающий отделом по приему товаров от производителя.
Создадим класс Site, вуступающий отделом по сопровождению сайта компании.
Создадим еще один класс для работы маркетплейса Database.
Теперь непосредственно создаем класс Маркетплеса.
Посмотрим применение.
Результат.