Facade — это структурный паттерн, который предоставляет простой интерфейс к сложной подсистеме, скрывая внутреннюю сложность.
Простыми словами: один метод вместо десяти вызовов в разные сервисы. Пульт от телевизора — это фасад к электронике внутри.
▪️ Пример:
Оформление заказа: нужно проверить наличие, списать деньги, создать доставку, отправить уведомление. Клиент не должен знать эти детали.
// Сложная подсистема
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();
public 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"), "Москва, ул. Пушкина");
▪️ Когда использовать
— Подсистема сложная, а клиенту нужен простой вход
— Хотите уменьшить связанность между слоями
— Типичный пример: сервисный слой в Spring-приложении
▪️ Минус
Фасад может стать God Object, если взять на себя слишком много логики.
🐸 Библиотека собеса по Java
#patterns