Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida de uso: Padrão STRATEGY

Olé pessoal!

Possuo uma dúvida sobre o uso do padrão Strategy!

Pelo que o instrutor falou e também pelas minhas pesquisas, o resumo da ópera, é que ele é um padrão de projeto comportamental, que cuida de agruparmos em interfaces strategy, situações onde temos diversas condicionais, ou ocasiões, onde utiliza o mesmo algoritmo, com pequenas mudanças de estado.

Porém cai numa situação no meu dia a dia, em que é o seguinte:

Existe um método, chamado montarParametrosRequest, em determinado momento, ele chama um método para obter qual a política ele deve usar:

entradaPO.setPolitica(definePoliticaDeConsulta(vo));

Quando vamos ver este método definePoliticaDeConsulta, ele possui diversos IF/Else, com condicionais para colocar a String da política:


public static String definePoliticaDeConsulta(DadosConsultaVo vo) {
        
        if (ePessoaFisica(vo)) {
            return POLICITA_PF;				
        }
        
        if (ePessoaJuridica(vo)) {
            return POLICITA_PJ;
        }
        //... possui mais condicionais com casos para outras politicas
}

Pelo que entendi da teoria do Strategy, não daria para utilizar para esse caso, pois estamos montando um objeto, o que cairia no caso de padrões criacionais, já que não é um algoritmo que realiza um comportamento e sim monta parâmetros, estou correto? Ou da para utilizar o Strategy?

Desculpe caso esteja confuso, se precisar estou a disposição para dar mais informações, obrigado pela força!

2 respostas
solução!

Olá Matheus, tudo bem?

O padrão Strategy é realmente um padrão comportamental que lida com a definição de uma família de algoritmos encapsulados em classes separadas e torna esses algoritmos intercambiáveis. Ele permite que o algoritmo varie independentemente dos clientes que o utilizam.

No seu caso específico, onde você tem uma lógica condicional para determinar a política de consulta com base em certas condições, o padrão Strategy pode não ser a melhor escolha. O padrão Strategy é mais adequado quando você tem algoritmos diferentes que podem ser selecionados dinamicamente com base em algum critério.

Uma abordagem alternativa que você pode considerar é o uso de um padrão Factory Method. Com o Factory Method, você pode criar uma classe responsável por criar a instância correta da política com base nas condições fornecidas. Isso permitirá que você encapsule a lógica de criação da política em uma classe separada, tornando seu código mais modular e flexível.

Aqui está um exemplo de como você pode implementar isso usando o padrão Factory Method:

public interface PoliticaDeConsulta {
    String definirPolitica(DadosConsultaVo vo);
}

public class PoliticaPF implements PoliticaDeConsulta {
    public String definirPolitica(DadosConsultaVo vo) {
        return "POLITICA_PF";
    }
}

public class PoliticaPJ implements PoliticaDeConsulta {
    public String definirPolitica(DadosConsultaVo vo) {
        return "POLITICA_PJ";
    }
}

public class PoliticaFactory {
    public PoliticaDeConsulta criarPolitica(DadosConsultaVo vo) {
        if (ePessoaFisica(vo)) {
            return new PoliticaPF();
        }
        
        if (ePessoaJuridica(vo)) {
            return new PoliticaPJ();
        }
        
        // outras condições e políticas aqui
        
        throw new IllegalArgumentException("Nenhuma política válida encontrada.");
    }
}

// No seu método montarParametrosRequest:
PoliticaDeConsulta politica = PoliticaFactory.criarPolitica(vo);
entradaPO.setPolitica(politica.definirPolitica(vo));

Dessa forma, você encapsula a lógica de criação da política na classe PoliticaFactory e usa a interface PoliticaDeConsulta para definir o comportamento das diferentes políticas. Isso torna seu código mais flexível, pois você pode adicionar novas políticas facilmente sem modificar o código existente.

Espero ter ajudado a esclarecer sua dúvida! Se tiver mais alguma pergunta, fique à vontade para perguntar. Bons estudos!

Obrigado Otávio!

Eu imaginei que teria que usar um padrão criacional mesmo, fiquei contente que meu pensamento estava certo!

Vou dar uma estudada no Factory Method.