Agregação é quando objetos usam atributos e métodos de outros objetos, certo?
Delegação é quando objetos enviam mensagems para outro para ajudá-lo a entender uma requisição, certo?
Então eu posso dizer que delegação e agregação são quase a mesma coisa? =S
Porque para objetos usarem atributos de outros objetos é necessário que um envie mensagem para o outro, não?
Na minha opinião é o seguinte:
1 - Agregação e composição dizem respeito à modelagem da sua classe ( pode-se usr UML para isso).
2 - Delegar é um “design pattern” que pode usar classes tanto com agregação quanto com composição.
Agregação é quando um objeto contém outro. Delegação envolve o uso. Quando um objeto delega, ou seja, repassa tarefas para que outro use.
Perceba que um objeto pode ter outro, mas não utiliza-lo. Quer saber um exemplo?
Pense numa classe que presenta uma lista de outros objetos. Nessa classe, você tem métodos para adicionar um objeto, remove-lo, obter o tamanho da lista, etc. No que a classe lista usa os objetos que estão dentro? Que funções ela pede para eles realizar por ela?
Nenhuma. Esse é um exemplo onde há composição, mas não há delegação.
O mesmo deverá valer para classes como Turma e Aluno.
Já delegação acontece com classes como Carro e Motor. Ao pedir para o carro dar a partida, o carro enviará um comando para que o motor comece a girar. O motor realizará o movimento, e isso refletirá no carro.
Por fim, é possível que um objeto delegue atividades para outro, mas usando uma composição simples, sem um vínculo tão forte. Como por exemplo, um método que receba um objeto por parâmetro e realize uma operação sobre ele. Note que a agregação não ocorreu, mas a delegação sim:
public class Aluno {
//A impressora não é parte do aluno.
//Ele só precisa de uma impressora na hora de imprimir!
public void ImprimirNome(Impressora impressora) {
impressora.imprimir(aluno.nome);
}
}