Implementação prática do Padrão Facade (Fachada) como parte do estudo dos Gang of Four Design Patterns. Este projeto demonstra como simplificar interfaces complexas através de uma camada de abstração unificada.
O Padrão Facade é um padrão estrutural que fornece uma interface simplificada para um subsistema complexo. Ele atua como uma "fachada" que oculta a complexidade interna do sistema, oferecendo apenas os métodos essenciais para o cliente.
- Simplificar interfaces complexas
- Reduzir dependências entre cliente e subsistemas
- Centralizar operações comuns em uma única interface
- Facilitar o uso e manutenção do sistema
┌─────────────────┐
│ CLIENTE │
└─────────┬───────┘
│
▼
┌─────────────────┐ ┌──────────────────┐
│ FACADE │ ────► │ Subsistema A │
│ │ └──────────────────┘
│ + operacao1() │ ┌──────────────────┐
│ + operacao2() │ ────► │ Subsistema B │
│ + operacao3() │ └──────────────────┘
└─────────────────┘ ┌──────────────────┐
────► │ Subsistema C │
└──────────────────┘
Facade/
├── src/
│ ├── facade/
│ │ └── SistemaFacade.java # Classe Facade principal
│ ├── subsistemas/
│ │ ├── SubsistemaA.java # Primeiro subsistema
│ │ ├── SubsistemaB.java # Segundo subsistema
│ │ └── SubsistemaC.java # Terceiro subsistema
│ ├── cliente/
│ │ └── Cliente.java # Classe cliente
│ └── Main.java # Demonstração do padrão
├── docs/
│ ├── diagrama-uml.png # Diagrama UML do padrão
│ └── explicacao.md # Documentação detalhada
└── README.md # Este arquivo
Este projeto implementa um sistema de Home Theater como exemplo do padrão Facade, onde diferentes subsistemas (TV, Som, Luzes, etc.) são controlados através de uma interface simplificada.
// SubsistemaA.java - Sistema de Som
public class SistemaSom {
public void ligar() {
System.out.println("Sistema de som ligado");
}
public void definirVolume(int volume) {
System.out.println("Volume ajustado para: " + volume);
}
public void definirEntrada(String entrada) {
System.out.println("Entrada definida para: " + entrada);
}
public void desligar() {
System.out.println("Sistema de som desligado");
}
}
// SubsistemaB.java - Sistema de Projeção
public class SistemaProjecao {
public void ligar() {
System.out.println("Projetor ligado");
}
public void definirEntrada(String entrada) {
System.out.println("Projetor configurado para: " + entrada);
}
public void modoTela() {
System.out.println("Modo tela ativado");
}
public void desligar() {
System.out.println("Projetor desligado");
}
}
// SubsistemaC.java - Sistema de Iluminação
public class SistemaIluminacao {
public void diminuirLuzes(int nivel) {
System.out.println("Luzes diminuídas para " + nivel + "%");
}
public void aumentarLuzes() {
System.out.println("Luzes aumentadas");
}
}// SistemaFacade.java
public class HomeTheaterFacade {
private SistemaSom som;
private SistemaProjecao projetor;
private SistemaIluminacao luzes;
public HomeTheaterFacade(SistemaSom som, SistemaProjecao projetor,
SistemaIluminacao luzes) {
this.som = som;
this.projetor = projetor;
this.luzes = luzes;
}
// Interface simplificada para o cliente
public void assistirFilme(String filme) {
System.out.println("Preparando para assistir " + filme + "...\n");
// Coordena todos os subsistemas
luzes.diminuirLuzes(10);
projetor.ligar();
projetor.definirEntrada("DVD");
projetor.modoTela();
som.ligar();
som.definirVolume(70);
som.definirEntrada("DVD");
System.out.println("\nTudo pronto! Aproveite o filme!");
}
public void finalizarSessao() {
System.out.println("Finalizando sessão de cinema...\n");
som.desligar();
projetor.desligar();
luzes.aumentarLuzes();
System.out.println("\nSistema desligado!");
}
}// Cliente.java
public class Cliente {
public static void main(String[] args) {
// Instância dos subsistemas
SistemaSom som = new SistemaSom();
SistemaProjecao projetor = new SistemaProjecao();
SistemaIluminacao luzes = new SistemaIluminacao();
// Facade simplifica o uso
HomeTheaterFacade homeTheater =
new HomeTheaterFacade(som, projetor, luzes);
// Interface simples para operações complexas
homeTheater.assistirFilme("Matrix");
System.out.println("\n" + "=".repeat(40) + "\n");
homeTheater.finalizarSessao();
}
}- Java JDK 8 ou superior
- IDE Java (IntelliJ, Eclipse, VS Code)
# Clone o repositório
git clone https://github.com/RGPaix/Fa-ade.git
cd Fa-ade/Facade
# Compile as classes Java
javac -d bin src/**/*.java
# Execute a demonstração
java -cp bin MainPreparando para assistir Matrix...
Luzes diminuídas para 10%
Projetor ligado
Projetor configurado para: DVD
Modo tela ativado
Sistema de som ligado
Volume ajustado para: 70
Entrada definida para: DVD
Tudo pronto! Aproveite o filme!
========================================
Finalizando sessão de cinema...
Sistema de som desligado
Projetor desligado
Luzes aumentadas
Sistema desligado!
- Interface única e fácil de usar
- Reduz a curva de aprendizado
- Diminui a complexidade para o cliente
- Mudanças nos subsistemas não afetam o cliente
- Centralização da lógica de coordenação
- Facilita refatorações futuras
- Cliente depende apenas da Facade
- Subsistemas podem evoluir independentemente
- Maior flexibilidade arquitetural
- Agrupa funcionalidades relacionadas
- Define pontos de entrada claros
- Melhora a estrutura do código
- Sistema tem muitos subsistemas complexos
- Quer simplificar uma API complexa
- Precisa de pontos de entrada bem definidos
- Quer reduzir dependências entre camadas
- Sistema já é simples o suficiente
- Clientes precisam de controle granular
- Performance é crítica (evitar camadas extras)
- Há apenas um subsistema envolvido
public class ContaBancariaFacade {
public void transferir(String origem, String destino, double valor) {
// Coordena: validação, débito, crédito, log, notificação
}
}public class CheckoutFacade {
public void finalizarCompra(Pedido pedido) {
// Coordena: pagamento, estoque, entrega, nota fiscal
}
}public class RelatorioFacade {
public void gerarRelatorioVendas(Date inicio, Date fim) {
// Coordena: consulta BD, processamento, formatação, envio
}
}- Adicione um novo subsistema
Iluminacao.javano pacotemodelos - Implemente um método
ajustarConfiguracoes()na classeHomeTheatre - Crie validações nos parâmetros de entrada dos métodos
- Adicione tratamento de exceções para operações que podem falhar
- Implemente um método
statusSistema()que mostra o estado atual de todos os equipamentos
- Adapter Pattern: Adapta interfaces incompatíveis
- Composite Pattern: Trata objetos únicos e compostos uniformemente
- Decorator Pattern: Adiciona funcionalidades dinamicamente
- Proxy Pattern: Controla acesso a objetos
- Abstração: Ocultar complexidade desnecessária
- Responsabilidade única: Facade tem papel bem definido
- Composição: Usar objetos ao invés de herança
- API Design: Como criar interfaces intuitivas
Desenvolvido por: @RGPaix
Disciplina: Design de Software
Padrão: Facade (Gang of Four)
Categoria: Padrão Estrutural
- Gang of Four: Design Patterns - Elements of Reusable Object-Oriented Software
- Head First Design Patterns - Freeman, Freeman, Bates, Sierra
- Refactoring Guru: Facade Pattern
- Oracle Java Docs: Best Practices
- GitHub: @RGPaix
- Issues: Reportar problemas
🏗️ "A simplicidade é a sofisticação máxima" - Leonardo da Vinci
Este projeto demonstra como o padrão Facade torna sistemas complexos mais simples e elegantes.