todos os filtros. As caracteristicas comuns podem ser encapsuladas na base do filtro e compartilhados entre todos os filtros. Por exemplo, uma base de filtro e um bom lugar para se incluir o comportamento padrao para os metodos de callback conteiner no filtro Declarada estrategia. Exemplo 6.11 mostra como isso pode ser feito.Base Exemplo 6.11 Estrategia Filtropublic class BaseEncodeFilter implements javax.servlet.Filter { private javax.servlet.FilterConfig myFilterConfig; public BaseEncodeFilter() { } public void doFilter(javax.servlet.ServletRequest servletRequest,javax.servlet.ServletResponse servletResponse, javax.servlet.FilterChain filterChain) throws java.io.IOException, javax.servlet.ServletException { filterChain.doFilter(servletRequest, servletResponse); } public javax.servlet.FilterConfig getFilterConfig() { return myFilterConfig; } public void setFilterConfig(javax.servlet.FilterConfig filterConfig) { myFilterConfig = filterConfig; }}Template Filter StrategyUsando uma base de filtro a partir do qual todos os outros herdam permite que a classe base para fornecer modelo de metodo [GOF] e suas funcionalidades. Neste caso, a base de filtro e usado para ditar as etapas gerais que devem completar cada filtro, deixando os detalhes de como concluir essa etapa para cada subclasse de filtro. Normalmente, estas seriam grosseiramente definido, metodos basicos que simplesmente impor uma estrutura limitada de cada modelo. Esta estrategia pode ser combinada com qualquer outra estrategia de filtro, tambem. Os anuncios no Exemplo 6.12 e Exemplo 6,13 mostram como usar esta estrategia com o filtro Declarada estrategia.Exemplo de 6,12 mostra uma base de filtro chamado TemplateFilter, como segue.Exemplo 6.12 usando uma estrategia de filtro de templatepublic abstract class TemplateFilter implements javax.servlet.Filter { private FilterConfig filterConfig; public void setFilterConfig(FilterConfig fc) { filterConfig=fc; } public FilterConfig getFilterConfig() { return filterConfig; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // Common processing for all filters can go here doPreProcessing(request, response, chain); // Common processing for all filters can go here doMainProcessing(request, response, chain); // Common processing for all filters can go here doPostProcessing(request, response, chain); // Common processing for all filters can go here // Pass control to the next filter in the chain or // to the target resource chain.doFilter(request, response); } public void doPreProcessing(ServletRequest request, ServletResponse response, FilterChain chain) { } public void doPostProcessing(ServletRequest request, ServletResponse response, FilterChain chain) { } public abstract void doMainProcessing(ServletRequest request, ServletResponse response, FilterChain chain);}Dada esta definicao de classe para TemplateFilter, cada filtro e implementado como uma subclasse que so deve implementar o metodo doMainProcessing. Estas subclasses tem a opcao, no entanto, de todos os tres metodos de execucao, se o desejarem. Exemplo 6,13 e um exemplo de uma subclasse de filtro que implementa o metodo de uma obrigatoria (ditada por nosso modelo de filtro) eo metodo de pre-processamento opcionais. Alem disso, um diagrama de sequencia para a utilizacao desta estrategia e mostrado na Figura 6.6.Example 6.13 Debugging Filter public class DebuggingFilter extends TemplateFilter { public void doPreProcessing(ServletRequest req, ServletResponse res, FilterChain chain) { //do some preprocessing here } public void doMainProcessing(ServletRequest req, ServletResponse res, FilterChain chain) { //do the main processing; }}No diagrama de sequencia na Figura 6.6, as subclasses de filtro, como DebuggingFilter, definir o processamento especificos, substituindo o metodo abstrato do MainProcessing e, opcionalmente, do PreProcessing e do PostProcessing. Assim, o modelo de filtro impoe uma estrutura para cada filtro de processamento, bem