Distinguindo entre delegação, composição e agregação (Java OO Design)
Eu estou enfrentando um problema contínuo distinguindo delegação, composição e agregação de um ao outro, e identificando os casos em que é melhor usar um sobre o outro.
Eu consultei um livro de Análise e Design Java OO, mas minha confusão ainda permanece. A principal explicação é esta:
Delegação: Quando meu objeto usa a funcionalidade de outro objeto como está sem alterá-lo.
Composição: Meu objeto consiste em outros objetos que, por sua vez, não podem existir depois que meu objeto é destruído - o lixo é coletado.
Agregação: Meu objeto consiste em outros objetos que podem viver mesmo depois que meu objeto é destruído.
É possível ter alguns exemplos simples demonstrando cada caso e o raciocínio por trás deles? De que outra forma esses exemplos podem ser demonstrados além do meu objeto simplesmente tendo uma referência a outro (s) objeto (s)?