Asociación:Es generalmente, una relación estructural entre clases, es decir, que en el ejemplo, existe un atributo de la clase Empresa, que es del tipo Persona.
Agregación:Es una relación que se derivó de la asociación, por ser igualmente estructural, es decir que contiene un atributo, que en todos los casos, será una colección, es decir un array, vector, etc, y además de ello la clase que contiene la colección debe tener un método que agregue los elementos a la colección. También se puede leer como que una empresa tiene varios empleados.
Nos esta diciendo que los objetos empleado forman parte del objeto empresa. Pero, su ciclo de vida no esta atado al del objeto empresa. Es decir si la empresa se destruye los empleados pueden seguir existiendo independientemente.
ComposiciónAl igual que en la agregación, es una relación estructural pero se le suma, que tiene un método de destrucción de los objetos. Y a diferencia de la asociación, el ciclo de vida del objeto empleado está relacionado con el del objeto empresa. Es decir que si la empresa se destruye, los empleados que tenia desaparecen.
Mucho se ha discutido a cerca de las agregaciones y las composiciones, el debate es casi tan caliente como el de los include y extends de los casos de uso. Ya que algunos sostienen que los lenguajes orientados a objetos, tienen garbage collector, por lo que no necesitan métodos de destrucción de los objetos (relacionados a los ciclos de vida en la compocición). Y que la programación es la misma para las composiciones y las agregaciones, y que la diferencia es meramente conceptual entre una y otras. Es mas existen varias interpretaciones, pero la expuesta es la cual yo me adhiero.
Fuente