Este é um post disponível para assinantes MVPou para quem possui Créditos DevMedia. Clique aqui para saber mais!
Artigo Java Magazine 21 - Mais Patterns Aplicados
Artigo publicado pela Java Magazine edição 21.

Atenção: por essa edição ser muito antiga não há arquivo PDF para download.Os artigos dessa edição estão disponíveis somente através do formato HTML.
Mais Patterns Aplicados
Comportamento e Estruturação de Aplicações
Aumente o nível de reutilização e a flexibilidade dos seus sistemas com os padrões Command,Composite,Decorator e Template Method
No artigo “Patterns aplicados” da edição anterior, vimos como incorporar padrões de projeto (design patterns) a código existente,criando a camada de acesso a dados de uma aplicação. Usamos os padrões Data Acess Obejct (DAO), Factory Method,Abstract Factory e Singleton. Mas nem só de acesso a dados vivem as aplicações. É necessário lidar com requisições de usuários, processamento da lógica de negócio e questão como logging,auditoria e segurança,entre muitos outros aspectos.
Neste artigo, são mostrados os padrões Command.Template Method,Composite e Decorator. Como na edição 20,vamos começar com um exemplo simples e acrescentar requisitos que sugiram a introdução dos padrões num contexto de evolução do sistema. Nos quadros “Patterns explicado” são mostrados abordagens alternativas e conseqüências de se adotar cada padrão. Usaremos como exemplo um sistema web de reservas de uma agência de viagens, em que os clientes podem reservar vôos e hotéis e alugar carros no destino. Você notará aqui dois aspectos importantes do uso de padrões de projeto: como eles auxiliam na comunicação entre desenvolvedores, formando um vocabulário expressivo (embora seus nomes, normalmente mantidos em inglês, possam levar ao “portungles”); e como colaboram formando rede de valor agregado que traz flexibilidade e facilidade de manutenção às aplicações.
ü Não há dependências entre este e o artigo da edição anterior. Além de ser usado um exemplo completamente diferente, os padrões aqui mostrados podem ser aplicados de forma independente dos apresentados na Edição 20. Basta conhecer os conceitos essenciais de padrões para acompanhar este artigo.
Versão inicial
Vamos começar com um servlet que atende a todas as solicitações de reserva, sendo os detalhes da solicitação submetidos como parâmetros do request por um formulário web. Esses parâmetros devem incluir o tipo de reserva e o item a ser reservado. Se ocorrer um erro no processamento da reserva, será retornada uma mensagem ao usuário.
Em nome da simplicidade as artes do programa que não forem relevantes ao nosso exemplo são resolvidos por métodos estáticos da classe Util,numa classe “mágica que vai nos permitir focar nos aspectos essenciais do sistema (em uma aplicação “real”,esta funcionalidade estaria distribuída em varias classes). Além disso, trechos poucos importantes ou repetidos serão substituídos por reticências.
O código inicial do servlet de reservas é mostrado na Listagem 1. Nele a interface Reserva é implementada pelas classes ReservaCarro,ReservaVoo,ReservaHotel. O método agendar() dessas classes faz a reserva do tipo correspondente numa determinada data. Se ocorrer um erro a mensagem poderá ser obtida pelo método getErro() da própria reserva (esta é uma simplificação - em uma aplicação “real” deveriam ser lançadas exceções de negócio”. Veja a organização das classes no diagrama da Figura 1.

Figura 1. Classes Iniciais
Listagem 1. versão 1:servlet de processamento de reservas
public class ServletReservas extends HttpServlet {
private static final String PARAM_TIPO = “PARAM_TIPO_RESERVA”;
//... Outros parâmetros
private static final String ATTR_ERRO = “ATTR_ERRO”;
"
Este é um post disponível para assinantes MVPou para quem possui Créditos DevMedia. Clique aqui para saber mais!
Julio Faerman
é consultor independente em desenvolvimento de sistemas corporativos e melhoria de processos de software. Certificado SCJP, SCWCD, SCBCD, SCDJWS e SCEA(I), bacharel em Ciência da Computação, MBA em Gerência de Projetos e Mestrando da Universidade Federal de Uberlândia.



