Command Pattern + Front Controller

Estou com uma duvida relacionada ao pattern command. Eu tenho um Front Controller que tem a função de processar todas as requisições da minha aplicação (vide codigo abaixo). Porém, na hora de criar o command específico para a ação eu não consigo enchergar alguma maneira de instanciar o command sem usar ifs encadeados ou switch (afinal achava que esse era o proposito de estar usando o pattern command). Observe, que passo a ação para o metodo getCommand que por sua vez vai ter de fazer uma serie de comparações para poder executar a ação. Minha duvida é como evitar esses ifs encadeados e se estou implementando corretamente o pattern Front Controller e o Pattern Command.

[code] private void processaRequisicao(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
String acao = request.getRequestURI();

			 // Esse objeto encapsula o request (guarda os dados)
			  HelperController helper = new  HelperController(request);
			  // Adquire o comando para a ação específica
			  Command command = helper.getCommand(acao);
			  // Delega o processamento para o objeto comando
			  String pagina = command.execute(helper.getDados());
		          // Dispatch Pattern
			  dispatch (request,response,pagina);
	 }

[/code]

Vlw …

Uma forma que fiz para resolver isso foi criar um metodo dentro do command que era canDO. Este metodo recebia uma string com acao passada na URI (exatamente como vc ) e tinha um retorno booleano. Assim varria um array de ações e executava este metodo. Aquilo que retornava true eu executava

Seria algo mais ou menos assim:

public ExemploCommand implements Command {
   
    public void execute (){
        System.out.println ("Olá mundo");
    }


    public boolean canDo (String key){
        //prefiro usar o equals da stringUtils da apache q já trata o null. Aqui é so um exemplo
        return key.equalsIgnoreCase("NOME DA MINHA ACAO")
    }
}

E seu front Controller ficaria assim:


Command [] commands = <pegar de algum lugar>
for (int i=0, i< commands.length; i++){
Command command = commands[i];
if(command.canDo(acao)) command.execute()

}

Esta solução as vezes pode significar uma perda de desempenho, mas fica bastante elegante e permite que se tenha mais de um comando para um mesma acao (tipo acao em sequencia)

Abraços
Andre Fonseca

Cria uma classe Controller que vai ser um Command, nela vc vai receber um parâmetro que indica pra qual classe, e qual metodo do seu Front Controler ele vai passar, no seu Front Controler vc redireciona pra o jsp específico.

Fazer em Servlets puro da um pouquinho de mão de obra, dê uma olhada em algum dos web-frameworks que já fazem isso.

Tu podes criar uma Factory pra criar os Commands. Nesta factory tu podes ler um properties que indica qual classe trata a acão e instanciar a classe:

Properties (colocar na pasta /WebContent/WEB-INF)

myAction1 = br.com.commands.impl.MyCommand1 myAction2 = br.com.commands.impl.MyCommand2
Factory

public class CommandFactory { public static Command getCommand(String action){ // primeiro carregar o properties... String className = prop.getProperty(action); if(className == null || className.trim().equals("")) throw new IllegalArgumentException("Invalid property for action " + action); Class<?> clasz = Class.forName(className); Command cmd = (Command) clasz.newInstance(); return cmd; } }
Desta forma tu não precisa colocar um monte de ifs.