Padrões de Projetos - Facade
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
ouencerrarFilme
, 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.