Compositions
[Previous]  [Next] 
|
User Manual [Previous]  [Next] CompositionsA composition is a subtype of association where the delete is mandatory regardless of the multiplicity (enforced delete). Compositions are used for associations where once the objects are associated, it makes sense for the deletion of one to cause the deletion of the other. This differs from the pre-existing associations, where the delete is dependent on the multiplicity.
For example, consider the case of a Vehicle and Wheel classes. With a regular association, the code would be as follows (where a Wheel can be associated to at most 1 Vehicles, and a Vehicle can have between 2 and 4 Wheels).
See Example 1
Here, the delete code for Vehicle does not delete the associated Wheels, since the multiplicity on Wheel is 0..1 which means the Wheel can exist without a Vehicle. However, on deleting a Vehicle it would make more sense for the associated Wheels to be deleted.
This is where compositions are useful. Rewriting the above example so that a Vehicle is composed with Wheel:
See Example 2
With the composition code, notice how the delete code for the Vehicle deletes all the Wheels associated, although the multiplicity is unchanged.
Compositions can be specified inline, or as separate associations (the same way as regular associations). The following two examples are equivalent to the Wheel-Vehicle example specified above.
See Examples 3 and 4
The following diagram is a representation of how the composition in the included examples is represented in UML, as generated in an editable class diagram by UmpleOnline.
Syntax The syntax for compositions is the same as for regular associations, except for the arrow used. While in regular associations, the syntax is a -- b for "a associated with b", for compositions it is a <@>- b for "a composed with b", or a -<@> b for "b composed with a". In the class diagrams generated for compositions, the symbol is a filled-in diamond arrow.
Example 1class Vehicle {} class Wheel {} association { 0..1 Vehicle v -- 2..4 Wheel w; } // @@@skipcppcompile Load the above code into UmpleOnline Example 2class Vehicle {} class Wheel {} // vehicle composed with wheels association { 0..1 Vehicle v <@>- 2..4 Wheel w; } Load the above code into UmpleOnline Example 3class Vehicle { 0..1 v <@>- 2..4 Wheel w; } class Wheel {} // @@@skipcppcompile Load the above code into UmpleOnline Example 4class Vehicle {} class Wheel { 2..4 w -<@> 0..1 Vehicle v; } // @@@skipcppcompile Load the above code into UmpleOnline Syntaxassociation : [=modifier:immutable]? [[associationEnd]] [=arrow:--  |->  |<-  |><  |<@>-  |-<@>] [[associationEnd]] ; inlineAssociation : [=modifier:immutable]? [[inlineAssociationEnd]] [=arrow:--  |->  |<-  |><  |<@>-  |-<@>] [[associationEnd]] ; association : association [associationNum]; |