Vamos aprender sobre um padrão de projeto (design patern) que você provavelmente já implementou sem dar um nome para isso. Trata-se de do padrão de projeto “Facade” (traduzido ao pé da letra fica como: “Fachada”)
De acordo com o Gang of Four, a intenção do padrão Facade é:
“Fornecer uma interface unificada para um conjunto de interfaces em um subsistema. Facade define uma interface de nível mais alto que torna o subsistema mais fácil de utilizar”.
Gamma, E., Helm, R., Johnson, R., Vlissides, J., Design Patterns: Elements of Reusable Object-Oriented Software, Reading, Mass.: Addison-Wesley, 1995, p. 185.
Basicamente, isso está dizendo que precisamos de uma nova maneira de interagir com um sistema que é mais fácil do que a forma atual, ou seja, podemos encapsular um determinado comportamento / função.
Ele nos permite utilizar uma determinada função complexa mais facilmente. A maior parte do trabalho ainda precisa ser feito pela função. A “fachada” que devemos definir fornece um conjunto de métodos mais fáceis de entender/utilizar.
O facade pode ser usado não só para criar uma interface mais simples em termos de chamadas de método, mas também para reduzir o número de objetos que um consumidor (quem utilizar o recurso) tem de lidar.
Cenário 1
O padrão facade pode ser usado não só para criar uma interface (quando digo interface, pense no abstrato de “interface”, e não em uma interface em C#, Java, etc) mais simples em termos de assinatura de método, mas também para reduzir o número de instancias que um objecto tem de lidar. Por exemplo, suponhamos que temos que cadastrar um objeto “Cliente” que tem que lidar com bancos de dados e uma API para consultar dados de um ERP. A aplicação deve primeiro se conectar na API e verificar se o CPF do cliente já não possui um cadastro no ERP. Em seguida, ele deve enviar os dados para o banco de dados para efetivar o cadastro, caso o CPF não exista. Nesse caso o padrão de projeto pode também ser utilizado para ocultar ou encapsular o acesso as dados. Teríamos que definir uma interface para passar como parâmetros os dados pertinentes. Esse exemplo foi mais conceitual.
Cenário 2
Nesse segundo exemplo vamos ver um exemplo mais pratico utilizando C#. Suponhamos que temos que enviar diversos e-mails em um sistema x. Para enviar um e-mail autenticado no C# temos que utilizar as classe do framework: SmtpClient, NetworkCredential, SmtpClient e AlternateView
* Coloquei a classe AlternateView para enviar uma versão html e uma versão texto no nosso exemplo.
Seria ruim instanciar todas classes e passar os dados de autenticação a todo momento (estou considerando que nosso exemplo não precisará ter parametrizado os dados de autenticação), nesse caso devemos criar uma classe para definir uma “interface” mais simples de uso que devemos informar os dados mínimos para o envio de e-mail funcionar, como segue:
public class EmailFacade { public static void Enviar(String emailPara, String emailCopia, String nomePara, String emailDe, String nomeDe, String titulo, String mensagemHtml, String mensagemTexto, MailPriority mailPriority) { SmtpClient smtpClient = new SmtpClient(); smtpClient.Host = "smtp.gmail.com"; smtpClient.EnableSsl = true; smtpClient.Credentials = new NetworkCredential("seuemail@gmail.com", ""); smtpClient.Port = 587; MailAddress destinatario = new MailAddress(emailPara, nomePara); MailAddress remetente = new MailAddress(emailDe, nomeDe); MailMessage mailMessage = new MailMessage(remetente, destinatario); if (!String.IsNullOrEmpty(emailCopia)) mailMessage.CC.Add(new MailAddress(emailCopia)); mailMessage.Subject = titulo; mailMessage.IsBodyHtml = true; mailMessage.Priority = mailPriority; AlternateView plainTextView = AlternateView.CreateAlternateViewFromString(mensagemTexto, null, MediaTypeNames.Text.Plain); plainTextView.TransferEncoding = TransferEncoding.QuotedPrintable; AlternateView htmlView = AlternateView.CreateAlternateViewFromString(mensagemHtml, null, MediaTypeNames.Text.Html); htmlView.TransferEncoding = TransferEncoding.QuotedPrintable; mailMessage.AlternateViews.Add(plainTextView); mailMessage.AlternateViews.Add(htmlView); smtpClient.Send(mailMessage); } }
Acima temos a definição da classe “EmailFacade”, com um método estático para envio de e-mail “Enviar”.
Como utilizar ela:
class Program { static void Main(string[] args) { EmailFacade.Enviar("emailDestino@email.com", null, "Nome dest.", "meuemail@email.com", "Meu nome", "Título", "Mensagem versão html", "Mensagem versão texto", MailPriority.Low); } }
Acima utilizamos a classe “EmailFacade” para enviar um e-mail. Quem utilizar o método “Enviar” da classe “EmailFacade” não saberá como ele se comportar, apenas conhece a assinatura do método que precisa utilizar.
O exemplo é bem simples, mas espero que tenha ajudado.
Até a próxima pessoal!
Ótimo exemplo