Strategy Pattern

Neste design pattern, o comportamento da classe ou do seu algoritmo é modificado durante a execução. No Strategy Pattern, criamos objetos que podem possuir várias representações, cada uma com um comportamento diferente, de acordo com a estratégia adotada.
Um dos exemplos mais comuns para este tipo de Design Pattern é o das Notas Fiscais: Uma loja existe em diversos Estados do Brasil. Em qualquer uma delas, o cliente pode comprar alguma coisa e o procedimento (rotinas) de compra é o mesmo. A diferença vem apenas no calculo das Notas Fiscais. Supondo que o calculo seja igual para os Estados de MG, SP e SC, mas é diferente para o AC.

Neste caso, criamos uma interface que abstrai o procedimento de criação das compras e classes que implementam esta abstrações.

Considere a lista abaixo como um checklist de implantação do Strategy Pattern:
– Identifique o comportamento que inconstante (suscetível a mudanças) e o ponto em que este comportamento interage com o resto da aplicação;
– Crie as assinaturas dos métodos em uma interface;
– Implemente as diversas possibilidades de cada método (da interface) em classes diferentes;
– Quem consumir este método, deve tratar direto com a interface;

Exemplo Prático:
Passageiro vai escolher um transporte do Aeroporto até a cidade. Ele pode escolher entre Ônibus, Carro Pessoal ou Taxi, dependendo do tempo, dinheiro e conveniência que ele quer.

  • Interface “Transporte”
public interface ITransporte {
	void transportar(Cliente cli);

}

 

  • Implemente as interfaces
class Onibus : ITransporte {
	public void transportar(Cliente cli) {
		//Transporta o cliente de onibus...
	}
}

class Carro : ITransporte {
	public void transportar(Cliente cli) {
		//Transporta o cliente de Carro...
	}
}

class Taxi : ITransporte {
	public void transportar(Cliente cli) {
		//Transporta o cliente de Taxi...
	}
}

 

  • Agora você deve definir como o código gerado com o Strategy Pattern vai ser implementado no seu sistema. Talvez com o padrão Builder ou Factory…

 

The following two tabs change content below.
Arquiteto de Software e Desenvolvedor Backend (quase Fullstack), geralmente trabalho com C#, PowerShell, Python, Golang, bash e Unity (esse é mais por hobby). Estou sempre buscando algo novo para aprender, adicionando novas ferramentas ao meu cinto de utilidades.
Posted in Conhecimento Técnico, Dev and tagged , , .