web-dev-qa-db-fra.com

Agrégation vs composition

Je comprends ce qu'est la composition dans la POO, mais je ne peux pas avoir une idée claire de ce qu'est l'agrégation. Quelqu'un peut-il expliquer?

220
Vinoth Kumar C M

Des règles simples:

  1. A "possède" B = Composition: B n'a aucun sens ni but dans le système sans A
  2. A "utilise" B = agrégation: B existe indépendamment (conceptuellement) de A

Exemple 1:

Une entreprise est une agrégation de personnes. Une entreprise est une composition de comptes. Lorsqu'une entreprise cesse ses activités, ses comptes cessent d'exister mais ses employés continuent d'exister.

Exemple 2: (très simplifié)

Un éditeur de texte possède un tampon (composition). Un éditeur de texte utilise un fichier (agrégation). Lorsque l'éditeur de texte est fermé, le tampon est détruit mais le fichier lui-même n'est pas détruit.

333
Curtis Batt

De http://en.wikipedia.org/wiki/Object_composition

L'agrégation diffère de la composition ordinaire en ce qu'elle n'implique pas la propriété. Dans la composition, lorsque l'objet propriétaire est détruit, les objets contenus le sont également. En agrégation, ce n'est pas nécessairement vrai. Par exemple, une université possède divers départements (par exemple, la chimie), et chaque département a un certain nombre de professeurs. Si l'université ferme, les départements n'existeront plus, mais les professeurs de ces départements continueront d'exister. Par conséquent, une université peut être considérée comme une composition de départements, tandis que les départements ont une agrégation de professeurs. De plus, un professeur peut travailler dans plus d'un département, mais un département ne peut pas faire partie de plus d'une université.

Ainsi - alors que vous avez une relation de propriété avec la composition, l'objet appartenant est également détruit lorsque le propriétaire l'est - une agrégation (et les objets contenus) peuvent exister indépendamment.

-

Mise à jour: Excuses - cette réponse est beaucoup trop simpliste avec le recul.

@Curtis Batt fournit une excellente définition dans sa réponse: Aggregation vs Composition

38
HorusKol

Il n'y a pas d'explication unique. Différents auteurs signifient différentes choses par agrégation. La plupart ne signifient pas vraiment quelque chose de spécifique.

20
reinierpost
  • La composition est une association

  • L'agrégation est une association

  • La composition est une association forte (si la vie de l'objet contenu dépend totalement de l'objet conteneur, elle est appelée association forte)

  • L'agrégation est une association faible (si la durée de vie de l'objet contenu ne dépend pas de l'objet conteneur, elle est appelée association faible)

Exemple:

class Contained {
    public void disp() {
        System.out.println("disp() of Contained A");
    }
}

public class Container {
    private Contained c;

    //Composition
    Container() {
        c = new Contained(); 
    }

    //Association 
    public Contained getC() {
        return c;
    }

    public void setC(Contained c) {
        this.c = c;
    }     

    public static void main(String[] args) {
        Container container = new Container();
        Contained contained = new Contained();
        container.setC(contained);
    } 
}
20
Pawan

La composition (mélange) est un moyen de combiner des objets ou des types de données simples en objets plus complexes. Les compositions sont un élément essentiel de nombreuses structures de données de base

L'agrégation (collection) diffère de la composition ordinaire en ce qu'elle n'implique pas la propriété. Dans la composition, lorsque l'objet propriétaire est détruit, les objets contenus le sont également. En agrégation, ce n'est pas nécessairement vrai

╔═══════════╦═════════════════════════╦═══════════════════════╗
║           ║       Aggregation       ║      Composition      ║
╠═══════════╬═════════════════════════╬═══════════════════════╣
║ Life time ║ Have their own lifetime ║ Owner's life time     ║
║ Relation  ║ Has                     ║ part-of               ║
║ Example   ║ Car has driver          ║ Engine is part of Car ║
╚═══════════╩═════════════════════════╩═══════════════════════╝

Les deux dénotent une relation entre un objet et ne diffèrent que par leur force. enter image description here

Notations UML pour différents types de dépendances entre deux classes enter image description here

Composition : Puisque le moteur fait partie de Car, la relation entre eux est Composition. Voici comment elles sont implémentées entre les classes Java.

public class Car {
    //final will make sure engine is initialized
    private final Engine engine;  

    public Car(){
       engine  = new Engine();
    }
}

class Engine {
    private String type;
}

Agrégation : Puisque l'organisation a la personne comme employé, la relation entre eux est l'agrégation. Voici à quoi ils ressemblent en termes de classes Java

public class Organization {
    private List employees;
}


public class Person {
    private String name;   
}

Source

13
Premraj

l'agrégation est une collection simple, comme un sac de billes

la composition implique des dépendances internes/fonctionnelles, comme les charnières sur une boîte

les voitures regroupent les passagers; ils entrent et sortent sans casser la fonctionnalité de la voiture

les pneus sont des composants; en retirer un et la voiture ne fonctionne plus correctement

[note: le pneu de secours est un agrégat!]

7
Steven A. Lowe

Je regarde toujours la composition comme `` a besoin d'un '', c'est-à-dire une voiture a besoin d'un moteur, et je considère l'agrégation comme `` des choses liées à un but ''. Donc, en gardant l'analogie avec la voiture, mon agrégation peut être de représenter un voyage qui peut impliquer de rassembler une voiture et des passagers. Le voyage ne possède ni la voiture ni les passagers, j'agrège des données liées à un scénario spécifique. Une fois le voyage terminé, la voiture et les passagers continuent. Lorsqu'une voiture est terminée, la voiture et son moteur sont normalement détruits ensemble.

2
Lazarus

Sémantiquement, tous les ensembles sont constitués de sous-ensembles, non? Donc:

  • L'agrégation se produit lorsque ces sous-ensembles existent indépendamment de l'ensemble père. Comme un moniteur peut être débranché de l'ordinateur pour être connecté à un autre.

  • La composition est lorsque ces sous-ensembles dépendent de l'existence de l'ensemble père. Comme une feuille fait partie d'un arbre ou que le foie fait partie d'un corps.

Ces concepts parlent du type de dépendance entre deux objets ou classes, conceptuellement. Directement dans un programme, dans une agrégation, lorsque l'objet père dispose, les objets agrégés doivent également être supprimés. Dans le même scénario pour une composition, les objets fils composites persisteront puis l'objet père sera distribué.

0
Negarrak

Que diriez-vous de cet exemple simple:

Un tableau d'objets est une composition. Un tableau de pointeurs vers des objets est une agrégation.

Si je supprime le premier, son contenu disparaît avec lui. Le second, d'un autre côté, peut disparaître sans affecter l'existence de ses membres à moins qu'il n'existe une méthode spécifique qui supprime chaque objet lorsque son pointeur est supprimé.

0
user2831074