Em um projeto Spring, seria viável a aplicação desse padrão strategy? Pergunto isso, pois há erro de ambiguidade quando a interface é implementada por 2 ou mais classes.
Em um projeto Spring, seria viável a aplicação desse padrão strategy? Pergunto isso, pois há erro de ambiguidade quando a interface é implementada por 2 ou mais classes.
Oi Erivelton,
É possível sim no Spring, sendo que se apenas uma implementação da interface deve ser injetada, então você precisa usar o conceito de Qualifier Bean: https://www.baeldung.com/spring-qualifier-annotation
Também daria para injetar todas as implementações em uma lista:
@Autowired
private List<Imposto> impostos;
Bons estudos!
switch(tipoImposto) {
case ICMS:
return orcamento.getValor().multiply(new BigDecimal("0.1"));
case ISS:
return orcamento.getValor().multiply(new BigDecimal("0.06"));
default:
return BigDecimal.ZERO
}
Fazendo um paralelo do Spring e com código acima que foram transformadas em implementações e supondo que fosse if, else if e else, teria alguma forma de definir explicitamente a implementação de acordo com o parâmetro vindo da requisição, como por exemplo: { "imposto": "ISS" }
Ou não sei se seria uma boa forma de implementar endpoints específicos para cada imposto e no controller definir o @Qualifier para a implementação específica da chamada do endpoint: GET .../orcamento/ICMS
@Component("icms")
public class ICMS implements TipoImposto{
public BigDecimal calcular(Orcamento orcamento) {
return orcamento.getValor().multiply(new BigDecimal("0.1"));
}
}
@RestController
@RequestMapping("/orcamento/ICMS")
public class OrcamentoComICMSController{
@Qualifier("icms")
private TipoImposto tipoImposto;
}
GET .../orcamento/ISS
@Component("iss")
public class ISS implements TipoImposto{
public BigDecimal calcular(Orcamento orcamento) {
return orcamento.getValor().multiply(new BigDecimal("0.06"));
}
}
@RestController
@RequestMapping("/orcamento/ISS")
public class OrcamentoComISSController{
@Qualifier("iss")
private TipoImposto tipoImposto;
}