it-swarm-eu.dev

Agregace vs. složení

Chápu, jaké složení je v OOP, ale nedokážu získat jasnou představu o tom, co je agregace. Může mi někdo vysvětlit?

220
Vinoth Kumar C M

Jednoduchá pravidla:

  1. „Vlastní“ B = Složení: B nemá v systému žádný význam ani účel bez A
  2. A "používá" B = Agregace: B existuje nezávisle (koncepčně) od A

Příklad 1:

Společnost je agregace lidí. Společnost je složení účtů. Když společnost přestane podnikat, její účty přestanou existovat, ale její lidé nadále existují.

Příklad 2: (velmi zjednodušený)

Textový editor vlastní vyrovnávací paměť (složení). Textový editor používá soubor (agregaci). Když je textový editor zavřený, vyrovnávací paměť je zničena, ale samotný soubor není zničen.

333
Curtis Batt

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

Agregace se liší od běžného složení tím, že neznamená vlastnictví. Když je vlastnický objekt zničen, jsou ve složení také obsažené objekty. V souhrnu to nemusí nutně být pravda. Například univerzita vlastní různá katedry (např. Chemie) a každá katedra má řadu profesorů. Pokud se univerzita zavře, katedry již nebudou existovat, ale profesoři těchto kateder budou nadále existovat. Univerzitu lze proto považovat za složení kateder, zatímco katedry mají agregaci profesorů. Kromě toho mohl profesor pracovat ve více než jednom oddělení, ale katedra nemohla být součástí více než jedné univerzity.

Takže - zatímco máte vlastnický vztah ke složení, vlastněný objekt je také zničen, když je vlastníkem - agregace (a obsažené objekty) může existovat nezávisle.

-

Aktualizace: Omlouvám se - tato odpověď je z pohledu zpět příliš zjednodušující.

@Curtis Batt poskytuje vynikající odpověď ve své odpovědi: Agregace vs Složení

38
HorusKol

Neexistuje jediné vysvětlení. Různí autoři znamenají různé věci agregací. Většina z nich opravdu neznamená nic konkrétního.

20
reinierpost
  • Složení je sdružení

  • Agregace je sdružení

  • Složení je silné přidružení (Pokud život uzavřeného objektu zcela závisí na kontejnerovém objektu, nazývá se silné přidružení)

  • Agregace je asociace slabá (Pokud život obsaženého objektu nezávisí na objektu kontejneru, nazývá se slabým sdružením)

Příklad:

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

Složení (směs) je způsob, jak kombinovat jednoduché objekty nebo datové typy do složitějších. Skladby jsou kritickým stavebním kamenem mnoha základních datových struktur

Agregace (kolekce) se liší od běžného složení v tom, že neznamená vlastnictví. Když je vlastnický objekt zničen, jsou ve složení také obsažené objekty. V souhrnu to nemusí nutně být pravda

╔═══════════╦═════════════════════════╦═══════════════════════╗
║           ║       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 ║
╚═══════════╩═════════════════════════╩═══════════════════════╝

Oba označují vztah mezi objektem a liší se pouze svou silou. enter image description here

UML notace pro různé druhy závislosti mezi dvěma třídami enter image description here

Složení : Protože je motor součástí automobilu, je mezi nimi vztah Složení. Takto jsou implementovány mezi třídami 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;
}

Agregace : Protože organizace má jako zaměstnance osobu, je mezi nimi vztah agregace. Takto vypadají z hlediska tříd Java)

public class Organization {
    private List employees;
}


public class Person {
    private String name;   
}

Zdroj

13
Premraj

agregace je jednoduchá sbírka, jako pytel kuliček

složení předpokládá vnitřní/funkční závislosti, jako jsou závěsy na krabici

agregáty cestujících; vstupují a vystupují bez narušení funkčnosti vozidla

pneumatiky jsou součásti; vyjměte jeden a auto již nefunguje správně

[poznámka: rezervní pneumatika je agregát!]

7
Steven A. Lowe

Vždy se na kompozici dívám jako na „potřebuje“, tj. Na auto potřebuje motor a na agregaci se dívám jako na „věci související s určitým účelem“. Takže pokud zůstanu v analogii s autem, mojí agregací může být představovat cestu, která může zahrnovat spojení automobilu a cestujících dohromady. Cesta nevlastní auto ani cestující, shromažďuji údaje, které se vztahují k určitému scénáři. Po dokončení cesty auto a cestující pokračují. Když auto skončí, auto a jeho motor jsou obvykle zničeny společně.

2
Lazarus

Sémanticky jsou všechny sady tvořeny podmnožinami, že? Proto:

  • Agregace je, když tyto podmnožiny existují nezávisle na sadě otců. Jako monitor lze odpojit od počítače a připojit k jinému.

  • Složení je, když tyto podmnožiny závisí na existenci otcovské sady. Protože list je součástí stromu nebo játra, je součástí těla.

Tyto koncepty pojmově pojednávají o druhu závislosti mezi dvěma objekty nebo třídami. Přímo v programu, v agregaci, když má otcovský objekt k dispozici, agregační objekty by měly být také zlikvidovány. Ve stejném scénáři pro kompozici zůstanou kompozitní objekty Son potom přetrvávat, zatímco se objekt otce vypustí.

0
Negarrak

A co tento jednoduchý příklad:

Pole objektů je kompozice. Pole ukazatelů na objekty je agregace.

Pokud odstraním první, jeho obsah s tím zmizí. Druhý, na druhé straně, může zmizet, aniž by to ovlivnilo existenci jeho členů, pokud neexistuje konkrétní metoda, která odstraní každý objekt, protože jeho ukazatel je vymazán.

0
user2831074