Hector, boa tarde.
O conceito de Interfaces ele fica mais compreensivel quando você entra nos conceitos de Design Patterns. Ali você consegue enxergar que uma Interface você pode utilizar conceitos de Polimorfismo. Vou te dar o seguinte exemplo:
Uma determinada empresa, fazem 3 validações para poder realizar um aumento para determinado colaborador
1-) O colaborador precisa ter no minimo 01 ano de empresa.
2-) O colaborador precisa estar defasado no salario.
3-) O colaborador precisa ter atingido a meta de no minimo 85%
Imagine que para isso você iria criar uma classe com a regra de negôcio.
public class ReajusteSalario(){
public void validar(Colaborador colaborador, double valorReajuste){
// linha que contem if se colaborador precisa ter no minimo 01 ano de empresa.
// linha que contem if se colaborador precisa estar defasado no salario.
// linha que contem if se colaborador precisa ter atingido a meta de no minimo 85%
// caso não foi barrada em nenhum if
double salarioAtual = colaborador.getSalario();
double salarioNovo = salarioAtual + valorReajuste;
colaborador.atualizarSalario(salarioNovo);
}
}
Olhando essa classe, ela fica muito verbosa e dificil a manutenção no codigo, tendo em vista que quanto mais regra de negocio existe, mais if's você irá precisar inserir.
Mas agora criando uma interface.
public interface ValidacaoReajuste(){
void validar(Colaborador colaborador, Double valorReajuste);
}
E os if's você irá separar por classe como por exemplo:
public class ValidacaoReajusteUmAnoEmpresa implements ValidacaoReajuste{
public double validar(Colaborador colaborador, Double valorReajuste){
// codigo da validação
}
}
public class ValidacaoReajusteSalarioDefasado implements ValidacaoReajuste{
public double validar(Colaborador colaborador, Double valorReajuste){
// codigo da validação
}
}
public class ValidacaoReajusteBateuAMeta implements ValidacaoReajuste{
public double validar(Colaborador colaborador, Double valorReajuste){
// codigo da validação
}
}
Voltando a classe que você tinha feito anteriormente que é a ReajusteSalario
, você consegue implementar dessa maneira.
public class ReajusteSalario(){
private List<ValidacaoReajuste> validacoes;
public ReajusteSalario(List<ValidacaoReajuste> validacoes){
this.validacoes = validacoes
}
public void validar(Colaborador colaborador, double valorReajuste){
this.validacoes.forEach(valida -> {
valida.validar(colaborador, valorReajuste);
});
double salarioAtual = colaborador.getSalario();
double salarioNovo = salarioAtual + valorReajuste;
colaborador.atualizarSalario(salarioNovo);
}
}
Tendo em vista que agora utilizando o Polimorfismo, pois todas as classes implementam de ValidacaoReajuste
podendo chamar elas em uma lista. Ou seja, caso for criado mais uma regra de negôcio, você só precisa criar mais uma classe com a regra e implementar de ValidacaoReajuste
e no metodo colaborador.atualizarSalario(salarioNovo);
é possivel colocar quais regras você quer que sejam adotadas.
Por exemplo:
public void atualizarSalario(double aumento) {
List<ValidacaoReajuste> validacoes = new ArrayList<>();
validacoes.add(new ValidacaoReajusteUmAnoEmpresa());
validacoes.add(new ValidacaoReajusteSalarioDefasado());
validacoes.add(new ValidacaoReajusteBateuAMeta());
ReajusteSalario reajusteSalarial = new ReajusteSalario(validacoes);
reajusteSalarial.validar(this, aumento);
}
Caso não deu pra entender, só falar.