Entendo qual é a composição do OOP, mas não consigo ter uma ideia clara do que é a agregação. Alguém pode explicar?
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:
Regras simples:
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.
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
Não existe uma explicação única. Diferentes autores significam coisas diferentes por agregação. A maioria não significa realmente nada específico.
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);
}
}
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.
Notações UML para diferentes tipos de dependência entre duas classes
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;
}
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!]
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.
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.
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.