Imagine que você está construindo uma casa. Você precisa lidar com eletricistas ⚡, encanadores 🚰, pedreiros 🧱, pintores 🎨 e muitos outros profissionais. Cada um deles tem sua especialidade e linguagem própria. Seria muito trabalhoso e confuso se você tivesse que interagir com cada um deles individualmente para realizar cada tarefa. 🤯
É aí que entra o Facade (Fachada). Ele atua como um gerente de projeto 👷,, fornecendo uma interface simplificada para você interagir com todos os subsistemas da casa. Você não precisa saber os detalhes de como a fiação elétrica é feita ou como os canos são conectados. Basta dizer ao gerente de projeto o que você quer, e ele se encarrega de coordenar os trabalhos com os especialistas 👍.
Facade 🏠 é um padrão de design que fornece uma interface unificada para um conjunto de interfaces em um subsistema. Ele esconde a complexidade do subsistema e torna mais fácil para o cliente usar o subsistema.
Benefícios
Reduz a complexidade: O Facade simplifica a interface do subsistema, tornando-o mais fácil de usar 🧩.
Aumenta a usabilidade: O Facade fornece uma interface de alto nível que é mais fácil de entender e usar do que as interfaces individuais do subsistema 📈.
Promove o baixo acoplamento: O Facade desacopla o cliente do subsistema, facilitando a manutenção e evolução do sistema 🔄.
Melhora a portabilidade: O Facade pode ser usado para encapsular um subsistema legado, facilitando a migração para novas tecnologias ⏩.
Show me the code:
package main
import "fmt"
// Subsistema 1
type SistemaArquivo struct{}
func (s *SistemaArquivo) LerArquivo(nomeArquivo string) string {
return fmt.Sprintf("Conteúdo do arquivo %s", nomeArquivo)
}
// Subsistema 2
type SistemaBancoDados struct{}
func (s *SistemaBancoDados) BuscarDados(query string) string {
return fmt.Sprintf("Dados do banco de dados para a query %s", query)
}
// Facade
type Fachada struct {
arquivo *SistemaArquivo
banco *SistemaBancoDados
}
func (f *Fachada) OperacaoComplexa() string {
resultado1 := f.arquivo.LerArquivo("exemplo.txt")
resultado2 := f.banco.BuscarDados("SELECT * FROM usuarios")
return fmt.Sprintf("%s\n%s", resultado1, resultado2)
}
func main() {
fachada := &Fachada{
arquivo: &SistemaArquivo{},
banco: &SistemaBancoDados{},
}
fmt.Println(fachada.OperacaoComplexa())
}
Neste exemplo, a Fachada 🏠 encapsula os subsistemas SistemaArquivo 💼 e SistemaBancoDados🛢️ . O método OperacaoComplexa da Fachada coordena as operações dos subsistemas, fornecendo uma interface simplificada 🤝 para o cliente.
Quando usar o Facade?
Quando você tem um sistema complexo 🧩 com muitas interfaces.
Quando você quer desacoplar 🛑 o cliente do subsistema.
Quando você quer fornecer uma interface simplificada 🎯 para um subsistema complexo.
Top comments (0)