🏗️ Facade: Simplifique o acesso a Sistemas Complexos

Guilherme Henrique - Aug 5 - - Dev Community

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())
}
Enter fullscreen mode Exit fullscreen mode

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.

. . .
Terabox Video Player