O Padrão de Fachada (ou padrão de fachada) é um padrão de design de software comumente usado com programação orientada a objetos. O nome é por analogia a uma fachada arquitetônica.
Uma fachada é um objeto que fornece uma interface simplificada para um corpo maior de código, como uma biblioteca de classes. Uma fachada pode:
- tornar uma biblioteca de software mais fácil de usar, entender e testar, já que a fachada tem métodos convenientes para tarefas comuns;
- tornar a biblioteca mais legível, pelo mesmo motivo;
- reduzir dependências de código externo no funcionamento interno de uma biblioteca, já que a maioria dos códigos usa a fachada, permitindo assim maior flexibilidade no desenvolvimento do sistema;
- enrolar uma coleção mal projetada de APIs com uma única API bem desenhada.
O padrão de design da fachada é frequentemente usado quando um sistema é muito complexo ou difícil de entender porque o sistema tem um grande número de classes interdependentes ou o seu código fonte não está disponível. Este padrão esconde as complexidades do sistema maior e fornece uma interface mais simples para o cliente. Normalmente envolve uma única classe de invólucro que contém um conjunto de membros exigidos pelo cliente. Estes membros acessam o sistema em nome do cliente de fachada e escondem os detalhes de implementação.
Usage
Uma fachada é usada quando uma interface mais fácil ou mais simples para um objeto subjacente é desejada. Alternativamente, um adaptador pode ser usado quando o invólucro deve respeitar uma determinada interface e deve suportar um comportamento polimórfico. Um decorador torna possível adicionar ou alterar o comportamento de uma interface em tempo de execução.
Padrão | Intent |
---|---|
Adaptador | Converte uma interface para outra de modo a corresponder ao que o cliente espera |
Decorador | Dinamicamente adiciona responsabilidade à interface, envolvendo o código original |
Fachada | Provê uma interface simplificada |
O padrão de fachada é tipicamente usado quando:
- é necessária uma interface simples para acessar um sistema complexo;
- as abstrações e implementações de um subsistema estão firmemente acopladas;
- é necessário um ponto de entrada para cada nível de software em camadas; ou
- um sistema é muito complexo ou difícil de entender.
Estrutura
Fachada: A classe de fachada resume os pacotes 1, 2, e 3 do resto da aplicação. Clientes: Os objetos estão usando o Padrão de Fachada para acessar recursos dos Pacotes.
Exemplo
Este é um exemplo abstrato de como um cliente (“você”) interage com uma fachada (o “computador”) para um sistema complexo (partes internas do computador, como CPU e HardDrive).
/* Complex parts */class CPU { freeze() { /* code here */ } jump(position) { /* code here */ } execute() { /* code here */ }}class Memory { load(position, data) { /* code here */ }}class HardDrive { read(lba, size) { /* code here */ }}/* Facade */class ComputerFacade { constructor() { this.processor = new CPU(); this.ram = new Memory(); this.hd = new HardDrive(); } start() { this.processor.freeze(); this.ram.load(this.BOOT_ADDRESS, this.hd.read(this.BOOT_SECTOR, this.SECTOR_SIZE)); this.processor.jump(this.BOOT_ADDRESS); this.processor.execute(); }}/* Client */let computer = new ComputerFacade();computer.start();