Para melhor organizar a manter componentes, e crucial que sejam separados por algum criterio. Isolando-os em grupos e possivel diminuir o acoplamento entre os componentes, fazendo com que as mudancas em um grupo nao impactem muito em outro grupo. Entre as diversas formas possiveis de separar os componentes, esta a tecnica de Camadas. Ao separar componentes em grupos chamados Camadas (Layers em ingles), o projetista agrupa componentes por responsabilidade em comum que possuam. Uma aplicacao Java EE tradicional, por exemplo, usa o modelo de 3 Camadas: Apresentacao, Negocios e Persistencia. Na Camada de Apresentacao estao todas as classes e demais artefatos (como paginas JSP) relacionados com a interacao entre o usuario e a aplicacao. A Camada de Negocios contem a modelagem do dominio do problema em classes de negocio e a Camada de Persistencia contem as classes com conhecimento sobre como persistir objetos no banco de dados (por exemplo, DAOs). O diagrama abaixo mostra os objetos em uma aplicacao simples. Neste caso nao ha separacao logica qualquer. Utilizando Camadas o projetista tem um criterio a utilizar quando decide agrupar duas ou mais classes, mas o uso de Camadas nao diz nada sobre como estes grupos se comunicam. O maximo que o uso de Camadas diz e sobre se estas sao transparentes (ou abertas) ou opacas (fechadas). Camadas transparentes nao evitam que uma superior enxergue a inferior, as opacas sim. ContextoO mecanismo de movimentacao da camada de apresentacao recebe pedido de diversos tipos de solicitacoes, as quais exigem variados tipos de tratamento. Alguns dos pedidos sao simplesmente encaminhadas para o componente manipulador adequado, enquanto outros pedidos devem ser modificados, auditadas ou nao comprimido antes de serem tratados posteriormente.ProblemaPre-processamento e pos-processamento de uma solicitacao de cliente da Web e de resposta sao necessarios.Quando um pedido entra em um aplicativo da Web, que muitas vezes precisam passar por testes de entrada diversos, antes da fase de processamento principal. Por exemplo,Tem o cliente foi autenticado?O cliente tem uma sessao valida?E o endereco IP do cliente de uma rede confiavel?Sera que o caminho de solicitacao violar quaisquer restricoes?Qual a codificacao que o uso do cliente para enviar os dados?Nos apoiamos o tipo de navegador do cliente?Alguns desses cheques sao testes, resultando em uma resposta sim ou nao que determina se o processamento continuara. Outras verificacoes manipular o fluxo de dados recebidos em uma forma adequada para o processamento.A solucao classica consiste de uma serie de verificacoes condicionais, com toda a verificacao nao abortar o pedido. If / else e uma estrategia padrao, mas essa solucao leva a fragilidade de codigo e um estilo de copiar e colar da programacao, pois o fluxo da filtragem e da acao dos filtros e compilado no aplicativo.A chave para resolver este problema de uma forma flexivel e discreto e ter um mecanismo simples para adicionar e remover componentes de processamento, em que cada componente conclui uma acao especifica de filtragem.Forcas processamento comum, como a verificacao do esquema de codificacao de dados ou informacoes de log sobre cada pedido, por solicitacao completa. Centralizacao da logica comum e desejado Os servicos devem ser