Algo parecido com Chain of Responsability

Li num site que o padrão Chain of Responsability, espera que somente um objeto na cadeia, manipule uma requisição, por exemplo.

Qual o padrão parecido com este, onde eu desejo que “n” objetos que implementam uma interface comum, processem a mesma requisição ?

Preciso implementar um tipo de cadeia de filtro, onde existe um objeto para ser processado por “n” filtros diferentes, cada um alterando ou não o conteúdo do objeto recebido e finalmente este objeto “transformado”, vai ser passado para outro que vai usá-lo, e não vai saber destas transformações, ou seja, independente de haver filtros ativos ou não, ele sabe manipular o objeto recebido.

Eu tava vendo servelet filter e é isto que eu queria implementar…

obrigado.

Servlet Filters sao uma cadeia de responsabilidade - uma CoR nao precisa necessariamente tratar o objeto apenas uma vez. :wink:

Pois é…

Me dá uma ajuda:

Quero pegar o fonte dos arquivos FilterChain.java e Filter.java.
Eles estão no J2EE SDK ou em soft tipo o Tomcat ?

Quero adaptar elas para as minhas necessidades, pois pretendo ter filtros processando conteúdo que vem de um HttpConnection.

Na verdade uma classe seria a FilterManager que registro os filtros, a Filter que é a interface, e outras classes seriam propriamente a implementação do filtro.

Penso por enquanto em ter um filtro que comprime o stream e outro filtro que encrypta.

Alguma sugestão para isto e onde encontro o fonte dos arquivos acima?

valeu ! :lol:

Fala, boone!

Cara, nao reinvente a roda… busque por aih uma implementacao de CoR (que é isso mesmo que vc quer) pronta…

Se vc olhar o Webwork, ou qq implementacao de Method Advices de AOP (pode olhar no Nanning), c vai sacar a essencia e poder fazer vc mesmo.

Mas a idéia básica é assim… se vc quer que o próprio filtro seja responsável pelo gerenciamento da cadeia (stack-style), vc pode ter uma interface do tipo:

public interface Filter {
   public void doFilter() throws FilterException;
   public void invokeNext() throws FilterException;
}

public abstract class AbstractFilter implements Filter {
   public final void setNext(Filter f) {...}
   public void invokeNext() throws FilterException {...}
}

Bom, vc tem que obrigar o implementador a chamar o invokeNext() no fim do doFilter(). Isso é bom quando vc tem uma chain que nao necessariamente chega até o fim.

tem outros esquemas, do tipo voltar um código. As Actions do WebWork retornam um String que é usado pra determinar a próxima acao no chain.

Se vc tiver direitinho o que vc quer na cabeca, nao vai ser difícil a solucao brotar do próprio problema.

boa sorte e []s!