Agrégation et Composition, c’est quoi ?

Quelle est la différence

La composition peut être vue comme une relation “fait partie de” (“part of”), c’est à dire que si un objet B fait partie d’un objet A alors B ne peut pas exister sans A. Ainsi si A disparaît alors B également.

L’agrégation quant à elle est vue comme une relation de type “a un” (“has a”), c’est à dire que si un objet A a un objet B alors B peut vivre sans A.

Le plus simple pour comprendre la différence entre ces deux notions restent un exemple concret.

Exemple C#

Prenons un système simplissime de gestion des employés dont voici le code :

  public class Employe
    {
        // Agrégation
        private Projet ProjetCourant;
        // Composition - On crée une instance de salaire
        // à l'intérieur de notre objet Employe
        private Salaire salaire = new Salaire();

        // Le projet sur lequel travaille de salarié
        // est passé en paramètre du constructeur
        public Employe(Projet projet, int salaire)
        {
            this.salaire.Annuel = salaire;
            this.ProjetCourant = projet;
        }
    }

    public class Salaire
    {
        public int Annuel { get; set; }
    }

    public class Projet
    {
        public string Nom { get; set; }
    }

La classe Employe possède deux attributs : Salaire et ProjetCourant. L’instance de Salaire fait partie de l’instance d’employé, si on supprime l’employé alors son salaire aussi est supprimé, c’est une relation de composition. En revanche l’employé a un projet courant. Si l’utilisateur part de l’entreprise le projet perdurera, c’est une relation d’agrégation.

Représentation UML

En UML la représentation d’une relation de composition est faite avec un losange plein. La représentation d’une relation d’agrégation est elle représentée par un losange vide.

Agrégation et composition