Что такое композиция (Composition) в объектно-ориентированном программировании?

«Что такое композиция (Composition) в объектно-ориентированном программировании?» — вопрос из категории ООП, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Композиция — это принцип проектирования «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). Композиция — более сильная связь.