Состав - более строгие отношения, чем агрегация. Композиция означает, что что-то настолько сильно связано с чем-то другим, что они не могут в принципе существовать независимо, или, если они могут, они живут в разных контекстах.
Пример из реального мира: вы определяете окно с графическим интерфейсом, а затем текстовое поле, где что-то написать.
Между классом, определяющим GUI, и классом, определяющим текстовое поле, находится композиция. Вместе они составляют виджет, который сам по себе может рассматриваться как объект. Предположим, вы удалили окно, а также текстовое поле.
Агрегация отличается в том смысле, что связь между двумя объектами является временной, нестабильной и случайной. Пример из реального мира. Предположим, у вас есть база данных объектов, содержащих несколько экземпляров данных. Теперь вы запускаете некоторый фильтр для сбора экземпляров данных, удовлетворяющих заданному критерию, и полученные экземпляры помещаются в графический список, чтобы пользователь мог их видеть. Когда графический виджет получает объекты, он может сформировать совокупность этих объектов и представить их. Если пользователь закрывает окно с графическим списком, и последний удаляется, объекты данных не должны быть удалены. Может быть, они отображаются где-то еще, или они вам все еще нужны.
Также, как правило, композиция определяется во время создания. Агрегация вместо этого определяется позже в жизненном цикле объекта.