Padrão de Projeto Facade em Java

Veja neste artigo os conceitos fundamentais e o funcionamento do Padrão de Projeto Facade. Será apresentado um exemplo de implementação prática do padrão em linguagem Java.

Introdução

Padrões de Projetos fazem parte da tecnologia avançada de orientação a objetos e estão sendo incorporados por ferramentas de análise orientada a objetos, bem como livros, artigos, cursos e seminários. Grupos de estudo sobre padrões são abundantes e sugerem que as pessoas aprendam Padrões de Projetos somente depois de terem dominado práticas básicas de orientação a objetos. Os Padrões de Projeto são modelos de como resolver o problema do qual trata, podendo ser usados em diferentes situações.

Os Padrões de Projetos para software orientado a objetos estão documentados no livro "Design Patterns: Elements of Reusable Object-Oriented Software" que contém um catálogo com 23 padrões de projetos (Design Patterns) orientados a software. A ideia dos autores do livro era documentar problemas recorrentes que aconteciam nos softwares aplicando a ideia de padrões de projeto a projetos de softwares, descrevendo uma estrutura para catalogar e descrever padrões de projeto, catalogar 23 padrões, entre outros.

Neste artigo será descrito o Padrão de Projeto Facade o qual será mais detalhado nas seções subsequentes do artigo.

Funcionamento

O Padrão de Projeto Facade oculta toda a complexidade de uma ou mais classes através de uma Facade (Fachada). A intenção desse Padrão de Projeto é simplificar uma interface. Existem outros dois Padrões de Projetos (Decorator e Adapter) já discutidos em outros artigos que possuem similaridades com o Padrão Facade, porém existem diferenças em relação a este padrão, como será visto mais adiante.

Com o Padrão Facade podemos simplificar a utilização de um subsistema complexo apenas implementando uma classe que fornece uma interface única e mais razoável, porém se desejássemos acessar as funcionalidades de baixo nível do sistema isso seria perfeitamente possível. É importante ressaltar que o padrão Facade não “encapsula” as interfaces do sistema, o padrão Facade apenas fornece uma interface simplificada para acessar as suas funcionalidades. Imagine que existe um sistema com diversas classes contendo diversos métodos e tenhamos que agrupar todas essas classes chamando diversos métodos para realizar uma determinada operação. Tendo uma Facade precisaríamos apenas construir um método que agrupe todas essas classes e chame todos esses métodos. Assim, quando usuário quiser fazer essa operação ele chamaria apenas a Facade que realizaria essa operação, simplificando muito todo o processo com uma simples interface. Vale ressaltar que isso não significa que uma Facade não tenha também funcionalidades próprias, ou seja, que tenha a sua própria inteligência e também utilize o subsistema. Um subsistema pode ter diversos Facades.

A definição oficial do padrão Facade é: “O Padrão Facade fornece uma interface unificada para um conjunto de interfaces em um subsistema. O Facade define uma interface de nível mais alto que facilita a utilização do subsistema”.

O Diagrama de classe abaixo mostra mais detalhes sobre o funcionamento do padrão Facade.

Figura 1: Diagrama de classe do Padrão Facade

No diagrama de classe acima tem-se o Client que é quem acessa a Facade que, por sua vez, é uma interface simplificada do subsistema, sendo esta unificada e fácil de ser utilizada pelo cliente. Abaixo da Facade tem-se as classes do sistema que podem ser chamados diretamente, mas estão sendo agrupados na Facade.

Exemplo de Implementação

Segue abaixo um exemplo de implementação em Java utilizando o Padrão Facade.

public class Cpu { public void start() { System.out.println("inicialização inicial"); } public void execute() { System.out.println("executa algo no processador"); } public void load() { System.out.println("carrega registrador"); } public void free() { System.out.println("libera registradores"); } } public class Memoria { public void load(int position, String info) { System.out.println("carrega dados na memória"); } public void free(int position, String info) { System.out.println("libera dados da memória"); } } public class HardDrive { public void read(int startPosition, int size) { System.out.println("lê dados do HD"); } public void write(int position, String info) { System.out.println("escreve dados no HD"); } } public class ComputadorFacade { private Cpu cpu = null; private Memoria memoria = null; private HardDrive hardDrive = null; public ComputadorFacade(Cpu cpu, Memoria memoria, HardDrive hardDrive) { this.cpu = cpu; this.memoria = memoria; this.hardDrive = hardDrive; } public void ligarComputador() { cpu.start(); String hdBootInfo = hardDrive.read(BOOT_SECTOR, SECTOR_SIZE); memoria.load(BOOT_ADDRESS, hdBootInfo); cpu.execute(); memoria.free(BOOT_ADDRESS, hdBootInfo); } }
Listagem 1. Exemplo de implementação do Padrão Facade

No exemplo acima podemos notar a quantidade de classes e métodos envolvidos quando precisamos inicializar o computador. Toda essa complexidade é exposta ao cliente que poderia chamar todas essas classes e cada um dos métodos das classes para realizar a tarefa de inicializar o computador. No entanto, ao usar uma Facade encapsulamos essa complexidade oferecendo uma interface simples e unificada ao cliente evitando acoplamento e complexidade. Apenas chamando o método ligarComputador() da classe ComputadorFacade tem-se uma interface simples que diz o que ela faz exatamente, sem expor a complexidade envolvida na operação.

Nota-se que todas as chamadas que estão no Facade poderiam ser feitas uma a uma no cliente, porém isso gera muito acoplamento e complexidade para o cliente, por isso a Facade simplifica e unifica esse conjunto de classes que gera muita complexidade.

Vantagens de Usar o Padrão Facade

O Padrão Facade nos permite desconectar a implementação do cliente de qualquer subsistema. Assim, se quiséssemos acrescentar novas funcionalidades no subsistema seria necessário apenas alterar a Facade ao invés de alterar diversos pontos do sistema. Além disso, o padrão Facade simplifica uma interface tornando-a muito mais simples e unifica um conjunto de classes mais complexas que pertencem a um subsistema.

Conclusão

O Padrão Facade é utilizado quando precisamos simplificar e unificar uma interface grande ou um conjunto complexo de interfaces. Uma das vantagens do padrão Facade é desconectar o cliente de um subsistema complexo, conforme pode ser visto no diagrama de classes. Um sistema pode ter diversos Facades simplificando diversos pontos do programa.

Bibliografia

Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados