Sobes.tech
Middle
263

O que é o padrão Fachada (Facade)?

Resposta da IA

sobes.tech IA

O padrão Facade é um padrão de design estrutural que fornece uma interface simples para um sistema complexo de classes, frameworks ou um conjunto de funções.

Objetivos principais:

  • Simplificar o uso de sistemas complexos.
  • Reduzir o acoplamento entre o cliente e o subsistema.
  • Tornar o código mais legível e fácil de manter.

Princípio de funcionamento:

O facade oculta a complexidade do subsistema, redirecionando as chamadas do cliente para os objetos apropriados dentro do subsistema. O cliente interage apenas com o facade, sem conhecer os detalhes de implementação dos componentes internos.

Exemplo:

# Subsistema: classes que representam componentes de um sistema complexo
class Amplificador:
    def on(self):
        print("Amplificador ligado")

    def off(self):
        print("Amplificador desligado")

    def set_volume(self, level):
        print(f"Volume do amplificador definido para {level}")

    def set_source(self, source):
        print(f"Fonte do amplificador definida para {source}")

class Tuner:
    def on(self):
        print("Tuner ligado")

    def off(self):
        print("Tuner desligado")

    def set_am(self):
        print("Tuner configurado para AM")

    def set_fm(self):
        print("Tuner configurado para FM")

    def set_frequency(self, frequency):
        print(f"Frequência do Tuner definida para {frequency}")

class DvdPlayer:
    def on(self):
        print("Reprodutor de DVD ligado")

    def off(self):
        print("Reprodutor de DVD desligado")

    def play(self, movie):
        print(f"Reproduzindo filme: {movie}")

# Padrão Facade: fornece uma interface simples ao subsistema
class HomeTheaterFacade:
    def __init__(self, amp, tuner, dvd):
        self.amp = amp
        self.tuner = tuner
        self.dvd = dvd

    def watch_movie(self, movie):
        print("Preparando para assistir a um filme...")
        self.dvd.on()
        self.amp.on()
        self.amp.set_source("DVD")
        self.amp.set_volume(5)
        self.dvd.play(movie)

    def end_movie(self):
        print("Desligando o home theater...")
        self.dvd.off()
        self.amp.off()

# Uso do facade pelo cliente
if __name__ == "__main__":
    amplificador = Amplificador()
    tuner = Tuner()
    dvd_player = DvdPlayer()

    home_theater = HomeTheaterFacade(amplificador, tuner, dvd_player)

    home_theater.watch_movie("Raiders of the Lost Ark")
    print("-" * 20)
    home_theater.end_movie()

Vantagens:

  • Simplificação: Esconde a complexidade do subsistema.
  • Redução do acoplamento: O cliente não depende diretamente de várias classes do subsistema.
  • Melhoria na legibilidade: O código do cliente torna-se mais compreensível.
  • Manutenção mais fácil: Mudanças internas no subsistema têm menor probabilidade de afetar o código do cliente.

Desvantagens:

  • Potencial crescimento: Se o facade ficar muito grande, pode tornar-se "grosso" e difícil de gerenciar.
  • Limitação de flexibilidade: O facade fornece um conjunto predefinido de operações. O acesso direto ao subsistema pode ser necessário para cenários mais flexíveis.

Aplicabilidade:

Usado quando é necessário fornecer uma maneira simples e unificada de interagir com um sistema complexo composto por múltiplos objetos interconectados.