Olá,
Pelo pouco que sei sobre reutilização de código, o que eu vi mostrado na ideia de composição não é o melhor caso. Reaproveitamos a lógica em partes, pois o código principal fica na classe AutenticacaoUtil, mas devemos reescrever as assinaturas nas classes chamando a classe com a implementação real, e qualquer mudança nos argumentos, nomes, etc., geraria a necessidade de alteração.
Eu penso em resolver da seguinte forma, que apesar de gerar mais código, imagino que pra mim o uso seria melhor para reutilização de código e mantendo o polimorfismo:
- Mantenho a interface Autenticavel, pois apesar de tudo o padrão é necessário;
- Criaria as classes FuncionarioAutenticavel e ClienteAutenticavel, ambos implementando a interface Autenticavel e estendendo as classes Funcionario e Cliente respectivamente;
Assim, o cliente, funcionários ou qualquer outra classe futura que precise se autenticar, eu aproveitaria dessa lógica.
Os métodos de autenticação, terão sua lógica repetida de certa forma, pois em todas classes com 'Autenticavel' precisaria implementar isso, talvez nelas colocaria a classe de AutenticacaoUtil.
Mas acho que ficaria melhor criar uma classe intermediária de funcionário que autentica, pois assim os funcionários que precisem disso podem herdar dela, e a lógica em sim fica separada:
- Classe Funcionario com os métodos e atributos genéricos de funcionários;
- Classe FuncionarioAutenticavel com métodos e atributos genéricos a funcionários que autenticam ao sistema, que herda Funcionario;
- Classe Gerente que possui métodos e atributos referente aos gerentes, que herda FuncionarioAutenticavel;
Ficou claro minha ideia? Seria algo ruim?
Pra mim, de ponto de vista de organização, separação, reutilização, ficaria melhor que a forma apresentada.
Gostaria de saber se seria uma boa resolução.