Na programação orientada a objectos, um objecto está relacionado com outro para utilizar a funcionalidade e o serviço fornecido por esse objecto. Esta relação entre dois objectos é conhecida como a associação na concepção geral de software orientado a objectos e representada por uma seta em Unified Modelling Language ou UML. Tanto a Composição como a Agregação são as formas de associação entre dois objectos, mas existe uma diferença subtil entre composição e agregação, que também é reflectida pela sua notação UML. Referimos a associação entre dois objectos como Composição, quando uma classe possui outras classes e outras classes não podem existir de forma significativa, quando o seu proprietário é destruído, por exemplo, a classe Humana é uma composição de várias partes do corpo incluindo Mão, Perna e Coração. Quando um objecto humano morre, toda a sua parte do corpo deixa de existir significativamente, este é um exemplo de Composição.
Programadores confundem frequentemente entre Associação, Composição, e Agregação nas discussões de design orientadas para objectos, esta confusão também faz a diferença entre Associação, Composição, e Agregação uma das questões populares em Entrevistas Java, só depois da diferença entre classe abstracta e interface.
Outro exemplo de Composição é Carro e a sua parte, por exemplo, motores, rodas, etc. As partes individuais do carro não podem funcionar quando um carro é destruído. Enquanto no caso da Agregação, incluindo objecto que pode existir sem fazer parte do objecto principal como um Jogador que faz parte de uma Equipa, pode existir sem uma equipa e pode também tornar-se parte de outras equipas.
Outro exemplo de Agregação é Aluno na Classe da Escola quando a Escola fecha, Aluno ainda existe e depois pode juntar-se a outra Escola ou assim. Na notação UML, uma composição é denotada por um diamante cheio, enquanto a agregação é denotada por um diamante vazio, o que mostra a sua diferença óbvia em termos de força da relação.
A composição é mais forte do que a agregação. Em suma, uma relação entre dois objectos é referida como uma associação, e uma associação é conhecida como composição quando um objecto possui outro, enquanto uma associação é conhecida como agregação quando um objecto utiliza outro objecto.este tutorial OOPS, veremos mais alguns exemplos para compreender melhor a diferença entre Associação, Composição, e Agregação.
Btw, se é novo no mundo da programação e design orientados para objectos, então também sugiro que siga um curso prático como UML e Fundações de Design Orientado para Objectos por Karloy Neisztor em Udemy. É um grande curso para compreender o processo completo de análise e desenho orientado a objectos para a criação de software de qualidade.
h2>Um exemplo de associação, composição e agregação em JavaAqui está um exemplo de composição e agregação, em termos de código Java. Olhando para este código, é possível medir as diferenças entre estes dois. A propósito, a Composição é também muito preferida no desenho orientado para objectos em vez de herança, até Joshua Bloch declarou a sua importância no livro clássico, Effective Java.
1. Composição:
Desde que o Motor é parte do Carro, a relação entre eles é Composição. Eis como são implementadas entre as classes Java.
public class Car {
>br>
2. Agregação:
Desde que a Organização tem Pessoa como empregados, a relação entre eles é Agregação. Eis como se parecem em termos de classes Java
public class Organization { private List employees;}
public class Person { private String name; }
br>
UML Diagrama de Associação, Composição, e Agregação
UML tem diferentes notações para denotar agregação, composição, e associação. A associação é denotada pela seta simples, enquanto a agregação é denotada pela seta com ponta de diamante vazia e a composição é denotada por uma seta com ponta de diamante preenchida.
Quando se desenha um diagrama UML para duas classes relacionadas A e B, onde A está associado a B, então o seu denotado por A -> B. É usada forma semelhante para mostrar a agregação e composição entre duas classes.
Aqui estão notações UML para um tipo diferente de dependência entre duas classes.
Como eu disse que todas as três denotam relação entre objectos e apenas diferem na sua força, também se pode vê-las como abaixo, onde a composição representa a forma mais forte de relação e associação sendo a forma mais geral.
h3>Associação vs Composição vs AgregaçãoAqui está a lista de diferenças entre Composição e Agregação em formato de pontos, para uma rápida revisão. Como disse, a diferença chave entre eles vem do ponto em que, no caso da Composição, um objecto é PROPRIETÁRIO de outro objecto, enquanto que no caso da agregação, um objecto é apenas um USUÁRIO ou outro objecto.
1) Se A e B duas classes estão relacionadas entre si de tal forma que, B deixou de existir, quando A é destruída, então a associação entre dois objectos é conhecida como Composição. Um exemplo é Carro e Motor. Enquanto que se A e B estão associados um ao outro, de tal forma que B pode existir sem estar associado a A, então esta associação é conhecida como Agregação.
Ver primeiro a Análise e Design Orientado para Objectos para mais exemplos de Composição e Associação no OOP.
>br>2) No caso da Composição A possui B por exemplo, a Pessoa é a proprietária da sua Mão, Mente e Coração, enquanto no caso da Agregação, A utiliza B por exemplo, a Organização utiliza Pessoas como empregado.
3) No diagrama UML a Associação é representada por uma cabeça de seta normal, enquanto que a Composição é representada por uma cabeça de seta de diamante cheia, e a Agregação é representada por uma cabeça de seta de diamante vazia, como se mostra abaixo e no diagrama anexo no terceiro parágrafo.
Associação A—->B
Composição A—–< preenchida>B
Aggregation A—–<>B
4) A agregação é uma forma mais leve de Composição, onde um objecto de subparte pode existir de forma significativa sem objectos principais.
5) Em Java, pode usar a palavra-chave final para representar a Composição. Uma vez que em Composição, o objecto Proprietário espera que um objecto de parte esteja disponível e funcione, ao torná-lo final, garante que, quando o Proprietário for criado, esse objecto de parte existirá. Esta é na realidade uma linguagem Java para representar uma forte forma de associação i.e. composição entre dois objectos.
6) Outra palavra interessante, que é útil para compreender a diferença entre Composição e Agregação na concepção de software é “parte de” e “tem”. Se um objecto é parte de outro objecto, por exemplo, Motor é parte de Carro, então a associação ou relação entre eles é Composição. Por outro lado, se um objecto só tem outro objecto, e.g. Carro tem o condutor, então é Agregação.
Isso é tudo sobre a diferença entre Associação, Composição e Agregação em UML, Java e Desenho orientado para Objectos. Uma vez que a análise orientada a objectos é mais sobre a definição da relação entre objectos, é importante saber que tipo de relação existe entre eles, composição e agregação é uma dupla forma de representar a relação entre dois objectos.
Outras aprendizagens
Princípios de Desenho Orientado a Objectos deSOLID
Absoluto Introdução à Programação Orientada a Objectos em Java
Java – Programação Orientada a Objectos
Mais alguns artigos para melhorar o seu objecto…Competências de programação e desenho orientado a objectos
Princípios de desenho orientado a objectos O programador Java deve saber
Porquê preferir a composição à herança em Java
Diferença entre sobrecarga e sobreposição em Java
Top 10 Perguntas de Entrevista sobre a classe abstracta e Interface
20 perguntas sobre padrão de desenho Java e desenho de software