Термины «состав» и «агрегация» означают более или менее одно и то же и могут использоваться взаимозаменяемо.Агрегация может использоваться чаще при описании контейнерных классов, таких как списки, динамические массивы, карты и очереди, в которых все элементы одного типа;однако можно найти оба термина для описания классов, определенных в терминах других классов, независимо от того, являются ли эти типы однородными (все одного типа) или разнородными (объекты разных типов).
Чтобы сделать это более понятным:
class Car {
// ...
private:
Engine engine;
Hood hood;
};
// The car is *composed* of an engine and a hood. Hence, composition. You are
// also bringing together (i.e. *aggregating*) an engine and hood into a car.
Связь между абстракцией и реализацией обычно подразумевает наследование, а не составление / агрегацию;обычно абстракция является интерфейсом или виртуальным базовым классом, а реализация является полностью конкретным классом, который реализует данный интерфейс.Но, чтобы сделать вещи запутанными, композиция / агрегация может быть частью интерфейса (потому что, например, вам может понадобиться установить / получить объекты, которые используются в качестве строительных блоков), и они также являются подходом к реализации (потому чтовы можете использовать делегирование для предоставления определения методов в вашей реализации).
Чтобы сделать это более понятным:
interface Car {
public Engine getEngine();
public Hood getHood();
public void drive();
}
// In the above, the fact that a car has these building blocks
// is a part of its interface (the abstraction).
class HondaCivic2010 implements Car {
public void drive(){ getEngine().drive(); }
// ...
}
// In the above, composition/delegation is an implementation
// strategy for providing the drive functionality.
Поскольку вы отметили свой вопрос как «мост», я должен отметить, чтоопределение шаблона моста - это шаблон, в котором вы используете композицию, а не наследование, чтобы учесть вариации на нескольких разных уровнях.Пример, который я изучил в колледже ... используя наследование, у вас может быть что-то вроде:
class GoodCharacter;
class BadCharacter;
class Mage;
class Rogue;
class GoodMage : public GoodCharacter, Mage;
class BadMage : public BadCharacter, Mage;
class GoodRogue : public GoodCharacter, Rogue;
class BadRogue : public BadCharacter, Rogue;
Как вы можете видеть, подобные вещи сходят с ума, и вы получаете смехотворное количество классов.То же самое, с шаблоном моста, будет выглядеть так:
class Personality;
class GoodPersonality : public Personality;
class BadPersonality : public Personality;
class CharacterClass;
class Mage : public CharacterClass;
class Rogue : public CharacterClass;
class Character {
public:
// ...
private:
CharacterClass character_class;
Personality personality;
};
// A character has both a character class and a personality.
// This is a perfect example of the bridge pattern, and we've
// reduced MxN classes into a mere M+N classes, and we've
// arguably made the system even more flexible than before.