Отношение между классами типа "содержит" (contain) или "состоит из называется агрегацией, или включением. Например, если аквариум Наполнен водой и в нем плавают рыбки, то можно сказать, что аквариум агрегирует в себе воду и рыбок.
Такое отношение включения, или агрегации (aggregation), изображается линией с ромбиком на стороне того класса, который выступает в качестве владельца, или контейнера. Необязательное название отношения записывается посередине линии.
В нашем примере отношение contain является двунаправленным. Объект класса Aquarium содержит несколько объектов Fish. В то же время каждая рыбка "знает", в каком именно аквариуме она живет. Каждый класс имеет свою роль в агрегации, которая указывает, какое место занимает класс в данном отношении. Имя роли не является обязательным элементом обозначений и может отсутствовать на диаграмме. В примере можно видеть роль home класса Aquarium (аквариум является домом для рыбок), а также роль inhabitants класса Fish (рыбки являются обитателями аквариума). Название роли обычно совпадает с названием соответствующего поля в классе. Изображение такого поля на диаграмме излишне, если уже указано имя роли. Т.е. в данном случае класс Aquarium будет иметь свойство (поле) inhabitants, а класс Fish - свойство home.
Число объектов, участвующих в отношении, записывается рядом с именем роли. Запись "0..п" означает "от нуля до бесконечности". Приняты также обозначения:
• "1 ..п" — от единицы до бесконечности;
• "О" — ноль;
• "1" — один;
• "п" — фиксированное количество;
• "0.. 1" — ноль или один.
Код, описывающий рассмотренную модель и явление агрегации, может выглядеть, например, следующим образом:
// определение класса Fish public class Fish {
// определения поля home (ссылка на объект Aquarium)
private Aquarium home;
public Fish() {
} }
// определение класса Aquarium public class Aquarium {
// определения поля inhabitants {массив ссылок на объекты Fish) private Fish inhabitants[]; public AquariumO { } }