Série DesignPattern: Facade

Olá Pessoal,

No post da série de hoje vamos conhecer o padrão facade, que tem como objetivo simplificar as interações entre o cliente com diversos sistemas, ou seja, para o cliente não ter que ser notificado em cada sistema sobre uma determinada mudança, ele apenas notifica o facade e este vai se encarregar de fazer as devidas notificações. Isso é muito comum no dia-dia, veja como: Uma venda é realizada, então o sistema precisa notificar de imediato o estoque que o produto X agora é Y-1, mas isso de forma simplificada por uma interface. Já pensou se um vendedor tivesse que ir em cada subsistema (estoque, financeiro etc) e informar que acabou de fazer uma venda e o estoque e volume em vendas para o produto XYZ foi alterado? Certamente isso seria ruim, certo? O mais interessante é que através de uma única interface o usuário possa realizar uma ação e o próprio sistema se encarregar de notificar os subsistemas dependentes. É isso que o padrão facade nos possibilita e vamos ver no nosso post de hoje.

Lets go…

Facade

Prover uma interface simplificada para utilização de varias interfaces do subsistema. A ideia é simplificar a iteração entre o cliente e diversos sistemas

Exemplo:

Quando um pedido é emitido precisamos notificar o estoque e financeiro.

Com facade, apenas dizemos o que queremos e o facade vai se encarregar das notificações. É como uma agência de turismo, digo para onde quero ir e eles se encarregam de notificar o hotel, a companhia aérea, o responsável pelo transfer etc.

A ideia do facade é encapsular todos os processos que envolvem a notificação aos demais sistemas. Ou seja, a forma que o agente de viagem notifica os parceirosda agência é encapsulada. Este pode ser por e-mail, telefone, via um sistema integrado etc. Isso o cliente final não sabe e também não importa muito, desde que a notificação aconteça.

Desenvolvimento

A seguir veremos um exemplo prático com facade, assim colocamos a teoria em prática. Primeiramente criamos o projeto a seguir:

Agora vamos criar três classes: Cliente, CiaArea, Hotel. A ideia é simular que o cliente solicitou para um agente de viagem um reserva e o agente fez uma reserva no hotel e na companhia aérea, ou seja, o agente de viagem foi responsável pela notificação. Então já sabemos quem é o nosso facade.

Cliente.java

Essa é a nossa classe cliente, nada de especial nela.

 package br.com.camilolopes.classes;

public class Cliente {

private String nome;

private String sobreNome;

private int idade;

public Cliente(String nome, String sobreNome, int idade) {

super();

this.nome = nome;

this.sobreNome = sobreNome;

this.idade = idade;

}

public String getNome() {

return nome;

}

public void setNome(String nome) {

this.nome = nome;

}

public String getSobreNome() {

return sobreNome;

}

public void setSobreNome(String sobreNome) {

this.sobreNome = sobreNome;

}

public int getIdade() {

return idade;

}

public void setIdade(int idade) {

this.idade = idade;

}

}

 CiaArea

Classe que representa as informações para reserva de um voo.

package br.com.camilolopes.classes;

public class CiaAerea {

private String nomeCia;

public CiaAerea(String nomeCia) {

super();

this.nomeCia = nomeCia;

}

public String getNomeCia() {

return nomeCia;

}

public void setNomeCia(String nomeCia) {

this.nomeCia = nomeCia;

}

public void reservaVoo(String nome, String sobreNome) {

System.out.println(“Voo reservado na Cia ” + nomeCia);

System.out.println(“para ” + nome + ” ” + sobreNome);

}

}

Hotel.java

Faz a reserva no hotel, nada de especial aqui também.

package br.com.camilolopes.classes;

public class Hotel {

private String nome;

private double valorDiaria;

public Hotel(String nome, double valorDiaria) {

super();

this.nome = nome;

this.valorDiaria = valorDiaria;

}

public String getNome() {

return nome;

}

public void setNome(String nome) {

this.nome = nome;

}

public double getValorDiaria() {

return valorDiaria;

}

public void setValorDiaria(double valorDiaria) {

this.valorDiaria = valorDiaria;

}

public void registraReserva(String nomeCliente, String sobreNomeCliente) {

System.out.println(“o Hotel ” + this.nome + ” informa que a reserva para “);

System.out.println(nomeCliente + ” ” + sobreNomeCliente + ” foi realizada com sucesso”);

}

}

Agora já temos o “pulo do gato”, nosso facade, que chamei de AgenciaFacade por questões didáticas:

AgenciaFacade.java

package br.com.camilolopes.facade;

import br.com.camilolopes.classes.CiaAerea;

import br.com.camilolopes.classes.Cliente;

import br.com.camilolopes.classes.Hotel;

/*

* A classe facade que é responsável por

* notificar as demais classes

*/

public class AgenciaFacade {

/*observe que a class facade é do tipo de relacionamento HAS-An

* com as classes que vão receber a notificação

*/

private Hotel hotel;

private CiaAerea ciaAerea

public AgenciaFacade(Hotel hotel, CiaAerea ciaAerea) {

super();

this.hotel = hotel;

this.ciaAerea = ciaAerea;

}

//aqui que acontece as notificações para  as dependências

public void registraViagem(Cliente cliente){

this.hotel.registraReserva(cliente.getNome(),cliente.getSobreNome());

this.ciaAerea.reservaVoo(cliente.getNome(),cliente.getSobreNome());

}

public Hotel getHotel() {

return hotel;

}

public void setHotel(Hotel hotel) {

this.hotel = hotel;

}

public CiaAerea getCiaAerea() {

return ciaAerea;

}

 public void setCiaAerea(CiaAerea ciaAerea) {

this.ciaAerea = ciaAerea;

}

AgenciaMain.java

package br.com.camilolopes.main;

import br.com.camilolopes.classes.CiaAerea;

import br.com.camilolopes.classes.Cliente;

import br.com.camilolopes.classes.Hotel;

import br.com.camilolopes.facade.AgenciaFacade;

public class AgenciaMain {

public static void main(String[] args) {

Cliente cliente = new Cliente(“Camilo”, “Lopes”, 25);

Hotel hotel = new Hotel(“Pijamas”, 150.00);

CiaAerea ciaAerea = new CiaAerea(“VaEmbora”);

//o facade sabe qual hotel e ciaAerea notificar

AgenciaFacade agencia = new AgenciaFacade(hotel, ciaAerea);

//informando para agencia o cliente que deseja viajar

agencia.registraViagem(cliente);

}

}

 Uma classe Java que criei apenas para testar a funcionalidade. Claro que podemos fazer essa validação usando unit test, mas preferi fazer com o método main. Assim, aqueles que não sabem usar unit test não ficam limitados.

Resultado

Rode aplicação e veja o resultado:

Pronto! Facade implementado como esperado, de maneira fácil que nem acreditamos que é tão simples assim. Mas é isso ai pessoal, espero que tenham gostado do post. Vou ficando por aqui.

Abracos, see ya!

Deixe um comentário

O seu endereço de e-mail não será publicado.