La diferencia entre agregación y composición es conceptual, no se diferencia por código.
Lo que es código se representa como la "agregación" de objetos por parte de un objeto único, por ejemplo: una clase Escuela "agrega" muchos Alumnos, lo que podría convertirse en un método "agregarAlumno" de la clase Escuela, donde lo único que hace es insertar el objeto dentro de una colección (array) de alumnos.
La composición se daría cuando la relación entre los dos tipos de objetos (Escuela, Alumno) es de "compuesto/componente" donde el componente no podría existir solo sin el compuesto.
Por ejemplo, en un contexto dado podría ser:
- Un círculo se dibuja como muchos puntos uno a continuación del otro, pero los puntos en nuestro contexto no pueden existir de forma aislada. Existe entonces una relación de composición entre Círculo y Puntos ("el círculo agrega muchos puntos").
- Una clase Banco que contiene muchos clientes y a su vez cada cliente contiene muchas cuentas. Se puede decir que hay una "relación de vida" entre Banco - Cliente y Cliente - Cuentas, donde los clientes no pueden estar "sueltos" en nuestro sistema sin estar asociados al Banco, de la misma forma no pueden existir Cuentas que no estén asociadas a un Cliente.
Me encontraste con ganas de escribir, pero te recuerdo que estos temas son elementales y se encuentra perfectamente la explicación conceptual de cada caso.