Перейти к основному содержимому

Паттерн "Фасад" в Java — один метод над подсистемой

Разработчику Архитектору

Обзор — в структурных паттернах. Здесь — Facade на Java: простой вход в сложную подсистему из нескольких сервисов.

Загрузка редактора схем…

Задача паттерна

Facade даёт один высокоуровневый API поверх набора классов. Клиент не вызывает десять сервисов по отдельности — он вызывает placeOrder(). Аналогия — пульт от телевизора вместо пайки к плате.

Фасад не добавляет новой бизнес-логики — он координирует существующие компоненты.


Пример — оформление заказа

import java.math.BigDecimal;

class InventoryService {
boolean checkStock(String productId) {
return true;
}
}

class PaymentService {
boolean charge(String userId, BigDecimal amount) {
return true;
}
}

class ShippingService {
String createShipment(String orderId, String address) {
return "TRACK-" + orderId;
}
}

class NotificationService {
void sendOrderConfirmation(String userId, String trackingId) {
System.out.println("Уведомление отправлено: " + trackingId);
}
}

class OrderFacade {
private final InventoryService inventory = new InventoryService();
private final PaymentService payment = new PaymentService();
private final ShippingService shipping = new ShippingService();
private final NotificationService notification = new NotificationService();

String placeOrder(String userId, String productId,
BigDecimal amount, String address) {
if (!inventory.checkStock(productId)) {
throw new IllegalStateException("Нет на складе");
}
if (!payment.charge(userId, amount)) {
throw new IllegalStateException("Оплата не прошла");
}
String trackingId = shipping.createShipment(productId, address);
notification.sendOrderConfirmation(userId, trackingId);
return trackingId;
}
}
OrderFacade facade = new OrderFacade();
String tracking = facade.placeOrder(
"user1", "SKU-100", new BigDecimal("2999.00"), "Москва, ул. Пушкина");

Facade в Spring-приложениях

Типичный сервисный слой (OrderService в Spring Boot REST) — фасад над репозиториями, интеграциями и доменными правилами. Контроллер остаётся тонким; сложность спрятана за одним методом createOrder().

FacadeAdapter
Упрощает свою подсистему для клиентаПереводит чужой интерфейс в нужный контракт
Один новый класс поверх многихОдин класс-переходник к legacy API

Когда применять и риски

Уместен, когда подсистема сложная, а клиенту нужен один сценарий "сделай заказ / импортируй файл / синхронизируй справочник".

Риск — фасад раздувается до God Object с тысячей строк. Дробите на use-case-классы (PlaceOrderFacade, CancelOrderFacade) или пакеты по bounded context.

Фасад и транзакции

В Spring границу транзакции часто вешают на метод фасада/сервиса (@Transactional), чтобы все вызовы подсистем прошли в одном unit of work.


См. также

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").