Структурный шаблон проектирования Фасад
«Фасад» (Facade) представляет собой структурный шаблон проектирования, целью которого является упрощение сложного интерфейса подсистемы, скрывая её внутреннюю организацию и представляя унифицированный API для внешних клиентов. Таким образом, фасад служит своего рода шлюзом между клиентами и сложной системой, позволяя взаимодействовать с ней проще и понятнее.
Назначение и применение
Главная задача фасада — скрыть детали внутренней реализации сложных подсистем, делая взаимодействие с ними простым и удобным. Например, система может состоять из множества взаимосвязанных классов и модулей, управление которыми требует знания особенностей каждого компонента. Шаблон фасады предлагает единообразный входной интерфейс, избавляющий клиента от необходимости разбираться во всей структуре системы.
Типичные ситуации, где применяется фасад:
- Усложнение интеграции нескольких различных частей системы.
- Необходимо упростить работу с библиотекой или фреймворком, имеющими сложную иерархию классов.
- Скрытие деталий низкоуровневой реализации.
Принцип работы
Принцип работы фасада основан на простоте взаимодействия:
- Клиент обращается к фасаду, передавая ему необходимые параметры.
- Фасад сам вызывает методы нужных внутренних классов, управляя ими прозрачным способом.
- Внутренняя логика остаётся скрытой от клиента, который работает исключительно с фасадом.
Пример реализации на PHP
Представим систему оплаты заказа онлайн-магазина, состоящую из трех компонентов: обработка заказов, доставка товаров и отправка уведомлений пользователям. Без фасада клиенту пришлось бы вызывать три метода последовательно. Однако фасад помогает решить проблему единым методом.
Подсистема заказа
class OrderProcessor {
public function processOrder(int $orderId): void {
echo "Обрабатываем заказ №{$orderId}\n";
}
}
Подсистема доставки
class DeliveryManager {
public function deliverProduct(int $orderId): void {
echo "Отправляем товар по заказу №{$orderId}\n";
}
}
Подсистема уведомлений
class NotificationSender {
public function sendNotification(int $orderId): void {
echo "Уведомляем покупателя о заказе №{$orderId}\n";
}
}
Сам фасад
class PaymentFacade {
private $orderProcessor;
private $deliveryManager;
private $notificationSender;
public function __construct(OrderProcessor $processor, DeliveryManager $manager, NotificationSender $sender) {
$this->orderProcessor = $processor;
$this->deliveryManager = $manager;
$this->notificationSender = $sender;
}
public function completePayment(int $orderId): void {
$this->orderProcessor->processOrder($orderId);
$this->deliveryManager->deliverProduct($orderId);
$this->notificationSender->sendNotification($orderId);
}
}
Как клиент пользуется фасадом?
$processor = new OrderProcessor();
$manager = new DeliveryManager();
$sender = new NotificationSender();
$facade = new PaymentFacade($processor, $manager, $sender);
$facade->completePayment(12345); // Всё сделано одной командой!
Результатом выполнения будет следующее сообщение:
Обрабатываем заказ №12345
Отправляем товар по заказу №12345
Уведомляем покупателя о заказе №12345
Преимущества и недостатки
Преимущества:
- Сокращение сложности использования системы для клиента.
- Более простая интеграция сторонних библиотек и инструментов.
- Изоляция изменений внутри подсистемы от клиентов.
Недостатки:
- Потенциально избыточный слой, который может замедлить выполнение операций.
- Возможное нарушение принципа единой ответственности (SRP), если фасад реализует слишком много функций.
Итоги
Шаблон «Фасад» отлично подходит для ситуаций, когда нужно интегрироваться с несколькими сложными системами или компонентами, организуя их совместную работу через единый удобный интерфейс. За счёт сокращения количества необходимых зависимостей фасад делает код проще и легче поддерживаемым.