Что это такое
Паттерн Facade ставит одну простую дверь перед сложной подсистемой. За дверью несколько частей работают вместе в нужном порядке; перед дверью вызывающий код делает один вызов.
Подсистема остаётся полностью доступной для тех, кому нужны подробности: фасад — это удобство, а не стена.
Пример: один вызов начинает день
Обогреватель, свет, кофемашина — три части, у каждой свой API и свой правильный порядок. StartDay() прячет всю эту хореографию за одним вызовом.
Одна простая дверь
Вызывающий код пишет одну строку; фасад знает порядок (сначала нагрев, кофе — последним). Если распорядок изменится, изменится только фасад.
Вывод: программа на Go и захваченный вывод
package main
import "fmt"
type Heater struct{}
func (Heater) On() { fmt.Println("обогреватель: нагрев до 21 градуса") }
type Lights struct{}
func (Lights) On() { fmt.Println("свет: включён на 40%") }
type CoffeeMachine struct{}
func (CoffeeMachine) Brew() { fmt.Println("кофе: готовится эспрессо") }
// Фасад: одна простая дверь ко всей подсистеме.
type House struct {
heater Heater
lights Lights
coffee CoffeeMachine
}
func (h House) StartDay() {
h.heater.On()
h.lights.On()
h.coffee.Brew()
}
func main() {
House{}.StartDay()
}
Когда использовать
Используйте, когда вызывающий код снова и снова повторяет один и тот же многошаговый танец с подсистемой или когда вы хотите показать небольшую стабильную поверхность поверх запутанной или меняющейся.
Не используйте, когда «подсистема» — это один тип с тремя методами. Фасад над тем, что и так просто, лишь добавляет лишнее расстояние.
Плюсы и минусы
Плюсы: вызывающий код получает один простой вызов; правильный порядок живёт ровно в одном месте; подсистема может меняться за стабильным фасадом.
Минусы: фасады склонны разрастаться в типы, которые делают всё подряд; фасад, который прячет слишком многое, заставляет людей обходить его стороной.