Ao assistir a aula de Interfaces, antes mesmo da aula terminar eu fiquei incomodado com uma coisa:
E se o código do método autentica() for o mesmo pra todas as classes que o implementarem e eu tiver que alterar o código desse método? Será que eu vou ter que caçar todas as classes que implementam esse método e alterar o código de todas, uma a uma?
Daí eu comecei a pesquisar e ancontrei alguém de quem já ouvi falar na faculdade, mas ainda não tive a oportunidade de implementar: Delegação.
Nós podemos deixar a responsabilidade de autenticar com uma classe própria para isso. Ficaria algo assim:
class Autenticador implements Autenticavel{
public boolean autentica(int senhaCorreta, int senhaInput){
if(senhaCorreta != senhaInput){
return false;
}
return true;
}
}
class Gerente extends Funcionario implements Autenticavel {
private int senha;
public boolean autentica(Autenticador autenticador, int senhaInput) {
return autenticador.autentica(this.senha, senhaInput);
}
}
O benefício aqui é que se a lógica de autenticação precisar ser alterada no futuro, sera necessário alterar somente o código da classe Autenticador.
(fonte: http://www.guj.com.br/t/resolvido-agregacao-e-delegacao/57438/4)