Ответ
Композиция — это принцип проектирования «has-a» («имеет»), при котором один класс (целое) включает в себя один или несколько объектов других классов (части) как часть своей внутренней структуры. Жизненный цикл части жестко привязан к жизненному циклу целого: часть создается и уничтожается вместе с целым.
Почему композиция предпочтительнее наследования? Принцип «Favor composition over inheritance» (предпочитай композицию наследованию)提倡使用组合而非继承,因为组合 обеспечивает:
- Гибкость: Поведение можно изменять динамически во время выполнения, подменяя компоненты.
- Слабое зацепление: Классы зависят от интерфейсов, а не от конкретных реализаций.
- Избегание хрупкости: Изменения в иерархии наследования могут сломать подклассы.
Пример композиции (Java):
// Классы-компоненты
class Engine {
void start() { System.out.println("Engine starts..."); }
}
class StereoSystem {
void playMusic() { System.out.println("Playing music..."); }
}
// Класс-композит, использующий композицию
class Car {
// Композиция: Car HAS-A Engine и HAS-A StereoSystem
private final Engine engine;
private final StereoSystem stereo;
public Car() {
// Части создаются внутри конструктора целого
this.engine = new Engine();
this.stereo = new StereoSystem();
}
public void startCar() {
engine.start(); // Делегирование ответственности компоненту
stereo.playMusic();
}
}
// Использование
Car myCar = new Car();
myCar.startCar(); // Engine starts... Playing music...
// Когда 'myCar' будет уничтожен, его Engine и StereoSystem также перестанут существовать.
Композиция vs. Агрегация: Оба являются ассоциациями «has-a», но при агрегации часть может существовать независимо от целого (например, Driver в Car). Композиция — более сильная связь.