Agregação vs Composição


206

Entendo qual é a composição do OOP, mas não consigo ter uma ideia clara do que é a agregação. Alguém pode explicar?

Respostas:


322

Regras simples:

  1. A "possui" B = Composição: B não tem significado ou propósito no sistema sem A
  2. A "usa" B = Agregação: B existe independentemente (conceitualmente) de A

Exemplo 1:

Uma empresa é uma agregação de pessoas. Uma empresa é uma composição de contas. Quando uma empresa deixa de fazer negócios, suas contas deixam de existir, mas seu pessoal continua a existir.

Exemplo 2: (muito simplificado)

Um editor de texto possui um buffer (composição). Um editor de texto usa um arquivo (agregação). Quando o Editor de texto é fechado, o buffer é destruído, mas o próprio arquivo não é destruído.


11
Então, um carro é um agregado ou uma composição de suas partes?
Reinierpost 31/03

2
E como a agregação é diferente de qualquer outro relacionamento entre dois tipos de entidades?
Reinierpost 31/03

55
@reinierpost Na realidade , um carro é uma agregação de peças, e as peças são simplesmente uma agregação de moléculas ... No entanto, em um modelo , tudo depende de suas necessidades. É importante tratar o motor como uma entidade separada para que você possa acompanhar sua vida útil independentemente do carro? Você pode reutilizar exatamente o mesmo motor em outro carro? Nesse caso, você provavelmente deseja agregação. Caso contrário, você deseja uma composição porque não se importa com motores que não fazem parte de carros, nem com a reutilização de motores.
Curtis Batt

3
o que está faltando é um exemplo de implementação para um entendimento completo ...
Chesnokov Yuriy

1
E o empregado quando uma empresa deixa de fazer negócios? Empregado e pessoas são entidades diferentes, certo? Então, posso dizer que a empresa é a composição dos funcionários?
Arjun

36

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

A agregação difere da composição comum, pois não implica propriedade. Na composição, quando o objeto proprietário é destruído, o mesmo ocorre com os objetos contidos. Na agregação, isso não é necessariamente verdade. Por exemplo, uma universidade possui vários departamentos (por exemplo, química) e cada departamento tem um número de professores. Se a universidade fechar, os departamentos não existirão mais, mas os professores desses departamentos continuarão a existir. Portanto, uma universidade pode ser vista como uma composição de departamentos, enquanto os departamentos têm uma agregação de professores. Além disso, um professor poderia trabalhar em mais de um departamento, mas um departamento não poderia fazer parte de mais de uma universidade.

Portanto - enquanto você tem um relacionamento de propriedade com a composição, o objeto de propriedade também é destruído quando o proprietário é - uma agregação (e os objetos contidos) pode existir independentemente.

-

Atualização: Desculpas - esta resposta é simplista demais em retrospectiva.

c.batt fornece uma excelente definição em sua resposta: Agregação x Composição


3
No exemplo que você cita, a composição é um para muitos e a agregação também tem um relacionamento um para muitos, embora aqui também possa haver um relacionamento muitos para muitos para a agregação (podemos supor que um professor pode ensinar em vários departamentos). Considerando que um departamento não pode fazer parte de várias universidades. Composição implica propriedade, enquanto agregação não vai além do relacionamento. A citação está correta, mas o comentário não.
Newtopian

1
não tem nada a ver com destruição! UML não define sistema de coleta de lixo.
Exibir nome

2
acho que o link da wikipedia está recebendo votos reflexivos, mas essa é uma definição terrível - como @bold apontou que esses relacionamentos não têm nada a ver com a GC. Isso também se desfaz quando um objeto é o componente de outros dois objetos, como a bola em uma junta de bola que une dois membros artificiais. O relacionamento Component é sobre dependência funcional.
Steven A. Lowe

1
Concordo que minha resposta está muito ausente - mas o artigo da WikiPedia também é ...
HorusKol

A diferença entre composição e agregação é clara. O problema da agregação é que não está claro como é diferente da associação comum.
Reinierpost


17
  • A composição é uma associação

  • A agregação é uma associação

  • A composição é uma associação forte (se a vida do objeto contido depende totalmente do objeto contêiner, isso é chamado de associação forte)

  • A agregação é uma associação fraca (se a vida do objeto contido não depende do objeto do contêiner, isso é chamado de associação fraca)

Exemplo:

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);
    } 
}

2
Qual é a diferença entre agregação e associação que não é composição nem agregação?
reinierpost

11

Composição (mistura) é uma maneira de combinar objetos simples ou tipos de dados em objetos mais complexos. As composições são um componente essencial de muitas estruturas básicas de dados

A agregação (coleção) difere da composição comum, pois não implica propriedade. Na composição, quando o objeto proprietário é destruído, o mesmo ocorre com os objetos contidos. Em agregação, isso não é necessariamente verdade

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

Ambos denotam relação entre objeto e diferem apenas em sua força. insira a descrição da imagem aqui

Notações UML para diferentes tipos de dependência entre duas classes insira a descrição da imagem aqui

Composição : Como o Motor faz parte do Carro, o relacionamento entre eles é Composição. Aqui está como eles são implementados entre as 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;
}

Agregação : Como a Organização tem Pessoa como funcionários, o relacionamento entre eles é Agregação. Aqui está como eles se parecem em termos de classes Java

public class Organization {
    private List employees;
}


public class Person {
    private String name;   
}

Fonte


este não parece oferecer nada substancial sobre os pontos feitos e explicado na prévia de 12 respostas
mosquito

Certamente livros podem existir sem bibliotecas. Mau exemplo!
T branco

Aqui, a lista de funcionários faz parte do objeto de organização. Como isso pode ser agregação?
Salman Muhammad Ayub

Qual a diferença entre associação e agregação?
Reinierpost

Eu amo essa resposta. Finalmente me explicou corretamente qual é a diferença entre agregação e composição.
PandasRocks

6

agregação é uma coleção simples, como um saco de bolas de gude

composição implica dependências internas / funcionais, como as dobradiças de uma caixa

carros agregam passageiros; eles entram e saem sem quebrar a funcionalidade do carro

os pneus são componentes; remova um e o carro não funcionará mais corretamente

[nota: o pneu sobressalente é um agregado!]


1

Eu sempre vejo a composição como 'precisa de um', ou seja, um carro precisa de um motor e a agregação como 'coisas relacionadas a um propósito'. Portanto, mantendo a analogia do carro, minha agregação pode ser representar uma jornada que pode envolver a aproximação de um carro e passageiros. A jornada não é de carro ou de passageiros, estou agregando dados relacionados a um cenário específico. Quando a viagem termina, o carro e os passageiros continuam. Quando um carro termina, o carro e seu motor são normalmente destruídos juntos.


0

Semanticamente, todos os conjuntos são feitos de subconjuntos, certo? Portanto:

  • A agregação ocorre quando esses subconjuntos existem independentemente do conjunto pai. Como um monitor pode ser desconectado do computador para ser conectado a outro.

  • A composição é quando esses subconjuntos dependem da existência do conjunto pai. Como uma folha é parte de uma árvore ou fígado é parte de um corpo.

Esses conceitos falam sobre o tipo de dependência entre dois objetos ou classes, conceitualmente. Diretamente em um programa, em uma agregação, quando o objeto pai descarta, os objetos agregados também devem ser descartados. No mesmo cenário para uma composição, os objetos filho compostos persistirão e o objeto pai será dispensado.


-1

Que tal esse exemplo simples:

Uma matriz de objetos é uma composição. Uma matriz de ponteiros para objetos é uma agregação.

Se eu excluir o primeiro, seu conteúdo desaparecerá com ele. O segundo, por outro lado, pode desaparecer sem afetar a existência de seus membros, a menos que exista um método específico que exclua cada objeto à medida que o ponteiro é excluído.


3
este não parece acrescentar nada substancial sobre os pontos feitos e explicado em antes 11 respostas
mosquito

Discordo respeitosamente, @gnat. Este é um exemplo útil de como os dois poderiam ser implementados. As pessoas aprendem melhor com exemplos. (Eu vim aqui para verificar meu entendimento de que um membro ponteiro provavelmente seria uma agregação e um membro objeto uma composição. Esta é a única resposta para abordar isso diretamente.)
Bob Stein
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.