Escolar Documentos
Profissional Documentos
Cultura Documentos
1. Introduo
Projetar sistemas orientados a objetos difcil e projetar sistemas orientados a objetos
reutilizveis ainda mais difcil. Os padres de projeto vm facilitar o desenvolvimento
de software oferecendo solues j testadas para problemas recorrentes no
desenvolvimento de software. Os padres conhecidos como Gof (Gangue dos quatro)
ficaram mundialmente conhecidos aps a publicao do livro Design Patterns: Elements
of Reusable Object-Oriented Software publicado em 1995 pelos autores Erich Gamma,
Richard Helm, Ralph Johnson e John Vlissides.
De acordo com Christopher Alexander, todo padro deve ter um Nome, um
Exemplo (diagramas, figuras e imagens que o descrevem), um Contexto (a descrio
das situaes sob as quais o padro se aplica), um Problema (uma descrio das foras e
restries envolvidas e como elas interagem) e a Soluo (relacionamentos estticos e
regras dinmicas descrevendo como construir artefatos de acordo com o padro).
Os padres GoF so classificados em 3 tipos: padres de criao (creational),
padres de estrutura (structural) e padres de comportamento (behavioral). No decorrer
deste artigo, sero apresentados exemplos da aplicao destes padres pela arquitetura
do Java EE7.
2. Faade - Estrutural
De acordo com o livro do Gof, o padro Faade busca prover uma nica interface para o
cliente encapsulando um conjunto de interfaces de um ou mais subsistemas. A
motivao para este padro surge em reduzir as complexidades dos subsistemas
envolvidos, minimizando a dependncia e a comunicao entre os subsistemas. Para
atingir este objetivo, inclu-se um objeto faade que prov uma nica interface
simplificada para as operaes mais comuns de um subsistema. O padro de projeto
Faade pode:
3. Proxy - Estrutural
Em programao, o padro de projeto proxy classificado como um padro de projeto
estrutural aplicados a objetos. Sua principal funo fornecer um substituto, ou um
intermediador, entre a classe que quer utilizar o comportamento e a classe que fornece
este comportamento. Abaixo segue um diagrama UML deste tipo de padro:
public FiltroConexao() {}
public void destroy() {}
@SuppressWarnings("static-access")
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
Connection connection = null;
try{
connection =
ConnectionFactoryPool.getInstance().getConnection();
// pendurando a connection na requisio
request.setAttribute("conexao", connection);
chain.doFilter(request, response);
}finally{
try {
if (connection != null){
connection.close();
connection = null;
}
} catch (SQLException e) {
e.printStackTrace();
logger.error(ExceptionToString.faca(e));
}
}
}
public void init(FilterConfig fConfig) throws ServletException {}
}
Suponha, por exemplo, que tenhamos um objeto que ao ser criado carrega dados
do banco de dados. Se precisarmos de vrias instncias desse objeto, no desejvel
que utilizemos o operador new() pois isto ir fazer a aplicao ir ao banco a cada nova
instncia, tornando o custo de criao desse objeto custoso. Como soluo, podemos
implementar o mtodo clone() e ento clonar as propriedades.
Em Java, o mtodo clone implementado pela classe superclasse
Java.lang.Object. Todos os objetos em Java extendem a classe Object, e, portanto,
podem chamar o mtodo clone() atravs do operador super. Abaixo, segue a
implementao do padro prototype em Java, atravs do mtodo clone():
public class Aluno implements Cloneable{
private String nome;
private int matricula;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public int getMatricula() {
return matricula;
}
public void setMatricula(int matricula) {
this.matricula = matricula;
}
@SuppressWarnings("finally")
public Aluno clone() {
Aluno aluno = null;
try {
aluno = (Aluno) super.clone();//Chama o clone de Object.
Isso copia automaticamente todos os atributos.
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}finally{
return aluno;
}
}
}
public class Main {
public static void main(String[] args) {
Aluno aluno = new Aluno();
aluno.setNome("Jos");
aluno.setMatricula(123456);
Aluno aluno2 = (Aluno) aluno.clone();
System.out.println(aluno2.getNome());
}
}
}
public void despacha() throws EmailException, MalformedURLException {
HtmlEmail email = new HtmlEmail();
email.setCharset("ISO-8859-1");
// Mensagem exibida caso o servidor no suporte HTML
email.setTextMsg("Seu servidor de e-mail no suporta mensagem
HTML");
if ((listaDestinatarios != null) && (emailDestinatario !=
null)){
//Envia e-mail ao tcnico responsvel e tcnicos
administrativos quando um determinado chamado tiver seu
prazo de atendimento vencido
Set<String> listaNomeAdministradores =
listaDestinatarios.keySet();
for (String nomeAdministrador :listaNomeAdministradores){
email.addBcc(listaDestinatarios.get(nomeAdministrad
or), nomeAdministrador);
}
email.addTo(emailDestinatario, nomeDestinatario);
}else if (listaDestinatarios != null){
//Envia e-mail para os tcnicos administrativos, com um
relatrio dos chamados com prazo de atendimento vencidos
Set<String> listaNomeDestinatario =
listaDestinatarios.keySet();
for (String nomeDestinatario: listaNomeDestinatario){
email.addTo(listaDestinatarios.get(nomeDestinatario
),nomeDestinatario);
}
}else{
// Destinatrio
email.addTo(emailDestinatario, nomeDestinatario);
}
// Remetente
email.setFrom(Recurso.getInstance().
getPropriedade("email_sender"),
Recurso.getInstance().getPropriedade("email_name"));
// Assunto
email.setSubject(assunto);
email.setHtmlMsg(mensagem + "<p> </p>");
//Usurio e senha de quem est enviando
email.setAuthenticator(new
DefaultAuthenticator(Recurso.getInstance()
.getPropriedade("email_sender"),
Recurso.getInstance().getPropriedade("email_password")));
//Configuraes do servidor de email
email.setHostName(Recurso.getInstance
().getPropriedade("smtp_server"));
email.setSmtpPort(Integer.parseInt(
Recurso.getInstance().getPropriedade("smtp_port")));
//Envia o email
email.send();
}
@Override
public void run() {
try {
despacha();
}catch (MalformedURLException e) {
e.printStackTrace();
} catch (EmailException e) {
e.printStackTrace();
}
}
}
public class Main {
public static void main(String[] args) {
EnviaEmail enviaEmail = new EnviaEmail();
enviaEmail.start();
}
}
System.out.println("Boa Noite");
}
}
}
Referncias
GAMMA, Erich et al. Design patterns: elements of reusable object-oriented software.
Pearson Education, 1994.
Linha de Cdigo, Design Patterns Fundamentais do J2EE. Disponvel em: <
http://www.linhadecodigo.com.br/artigo/363/design-patterns-fundamentais-doj2ee.aspx> Acesso em 04 de maio de 2014.
Oracle, Core J2EE Patterns - Session Facade. Disponvel em <
http://www.oracle.com/technetwork/java/sessionfacade-141285.html> Acesso em 04 de
maio de 2014.
Devmedia, Conhea o Pattern Proxy - GoF (Gang of Four). Disponvel em <
http://www.devmedia.com.br/conheca-o-pattern-proxy-gof-gang-of-four/4066> Acesso
em 04 de maio de 2014.
Software Design Pattern. In: WIKIPDIA, a enciclopdia livre. Flrida: Wikimedia
Foundation, 2014. Disponvel em:
<http://en.wikipedia.org/wiki/Software_design_pattern>. Acesso em: 27 maio 2014.