Padrões de Projetos - Facade

De Aulas
Revisão de 13h39min de 31 de outubro de 2024 por Admin (discussão | contribs)
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)


Afluentes: Modelos, métodos e técnicas da engenharia de software

Definição

O padrão de projeto Facade é outro padrão estrutural que oferece uma interface simplificada para um conjunto complexo de classes ou subsistemas. Ele é útil para esconder a complexidade de um sistema e fornecer uma interface mais amigável ao cliente.

O termo Facade é de origem francesa e se pronuncia, em português como façáde, da mesma forma que se pronuncia em francês e “fachada”, referindo-se à ideia de uma interface que esconde a complexidade interna, como a fachada de um prédio oculta o que há dentro.

Como o Facade Funciona

O padrão Facade cria uma classe que encapsula as interações com um conjunto de classes ou subsistemas complexos. O cliente, em vez de interagir diretamente com todas essas classes, se comunica apenas com a classe Facade, que se encarrega de coordenar as chamadas aos subsistemas.

Vantagens do Facade

  • Simplicidade: Reduz a complexidade ao expor uma interface mais fácil de usar.
  • Desacoplamento: O cliente não precisa saber dos detalhes internos do sistema; ele interage apenas com o Facade.
  • Modularidade: Facilita a manutenção e a escalabilidade, pois o cliente depende apenas do Facade e não de cada subsistema individual.

Exemplo em Java

Vamos imaginar um sistema de Home Theater, com componentes como DVD player, projetor, sistema de som e luzes. A classe Facade simplifica o processo de ligar e configurar todos esses componentes.

DVDPlayer.java

// Subsistema 1: DVD Player
class DVDPlayer {
    public void ligar() {
        System.out.println("DVD Player ligado.");
    }

    public void play(String filme) {
        System.out.println("Reproduzindo o filme: " + filme);
    }

    public void desligar() {
        System.out.println("DVD Player desligado.");
    }
}

Projetor.java

// Subsistema 2: Projetor
class Projetor {
    public void ligar() {
        System.out.println("Projetor ligado.");
    }

    public void ajustarProjecao() {
        System.out.println("Ajustando a projeção do projetor.");
    }

    public void desligar() {
        System.out.println("Projetor desligado.");
    }
}

Som.java

// Subsistema 3: Som
class Som {
    public void ligar() {
        System.out.println("Som ligado.");
    }

    public void ajustarVolume(int nivel) {
        System.out.println("Volume ajustado para " + nivel);
    }

    public void desligar() {
        System.out.println("Som desligado.");
    }
}

Luzes.java

// Subsistema 4: Luzes
class Luzes {
    public void escurecer() {
        System.out.println("Luzes escurecidas para a sessão de cinema.");
    }

    public void acender() {
        System.out.println("Luzes acesas.");
    }
}

HomeTheaterFacade.java

// Classe Facade para o Home Theater
class HomeTheaterFacade {
    private DVDPlayer dvdPlayer;
    private Projetor projetor;
    private Som som;
    private Luzes luzes;

    public HomeTheaterFacade(DVDPlayer dvdPlayer, Projetor projetor, Som som, Luzes luzes) {
        this.dvdPlayer = dvdPlayer;
        this.projetor = projetor;
        this.som = som;
        this.luzes = luzes;
    }

    public void iniciarFilme(String filme) {
        System.out.println("Preparando para assistir ao filme...");
        luzes.escurecer();
        projetor.ligar();
        projetor.ajustarProjecao();
        som.ligar();
        som.ajustarVolume(5);
        dvdPlayer.ligar();
        dvdPlayer.play(filme);
    }

    public void encerrarFilme() {
        System.out.println("Encerrando a sessão de cinema...");
        dvdPlayer.desligar();
        som.desligar();
        projetor.desligar();
        luzes.acender();
    }
}

Main.java

// Classe de teste
public class Main {
    public static void main(String[] args) {
        // Criação dos componentes do Home Theater
        DVDPlayer dvd = new DVDPlayer();
        Projetor projetor = new Projetor();
        Som som = new Som();
        Luzes luzes = new Luzes();

        // Criação da fachada do Home Theater
        HomeTheaterFacade homeTheater = new HomeTheaterFacade(dvd, projetor, som, luzes);

        // Usando a fachada para assistir a um filme
        homeTheater.iniciarFilme("Blade Runner");
        System.out.println();
        homeTheater.encerrarFilme();
    }
}

Explicação do Código

  • DVDPlayer, Projetor, SistemaDeSom e Luzes: São classes individuais que representam cada componente do sistema de Home Theater.
  • HomeTheaterFacade: É a classe Facade que simplifica o processo de iniciar e encerrar uma sessão de cinema. O cliente chama apenas iniciarFilme ou encerrarFilme, e a fachada coordena as interações com os diversos componentes.
  • Main: A classe de teste cria os componentes e usa a fachada para assistir a um filme.

Saída Esperada

Preparando para assistir ao filme...
Luzes escurecidas para a sessão de cinema.
Projetor ligado.
Ajustando a projeção do projetor.
Som ligado.
Volume ajustado para 5
DVD Player ligado.
Reproduzindo o filme: Blade Runner

Encerrando a sessão de cinema...
DVD Player desligado.
Som desligado.
Projetor desligado.
Luzes acesas.

Benefícios do Facade no Exemplo

A classe HomeTheaterFacade abstrai a complexidade de configurar todos os sistemas, permitindo que o cliente tenha apenas uma chamada para iniciar ou encerrar o filme, simplificando o uso do sistema de Home Theater.