Різниця між делегуванням і композицією stack overflow російською

Це різні поняття.

Делегування - це коли частина роботи клас "перекладає на" інші класи.

Наприклад, начальник розробки, отримавши замовлення на нову фічу, делегує це завдання одному зі своїх підлеглих.

Приклад делегування в програмуванні - коли клас, який виконує складний алгоритм логірует свої дії не самостійно (відкриваючи файл і дописуючи в нього), а за допомогою класу Logger. викликаючи в потрібних місцях його методи.

Зазвичай делегування протиставляють реалізацію чогось в тому ж класі. Наприклад, якщо у вас є клас-"всемогутор", то краще розділити його на кілька класів, у кожного з яких буде своя зона відповідальності. Основний клас буде лише займатися диспетчеризацией викликів між цими класами.

Композиція - це коли між модельованими об'єктами явно простежується ставлення "частина - ціле" (has a).

Наприклад, моделюючи автомобіль, природно вважати, що двигун - це частина автомобіля. Програмуючи цю модель, Ви висловіть це в тому, що об'єкт класу Engine стане членом класу Auto.

Композиції зазвичай протиставляють агрегацію і асоціацію. Агрегація схожа на композицію в тому, що це теж відношення виду частина-ціле. проте між об'єктами немає відносини володіння. Наприклад, "група студентів" - студент частина групи, але студент може існувати і поза групою. Тобто деструктор групи не повинен "вбивати" об'єктів-студентів. Асоціація висловлює будь-яке відношення між об'єктами, які можуть викликати методи один одного.

Тобто делегування можна влаштувати маючи як відношення асоціації. так і ставлення композиції між об'єктами.

Ще композиції протиставляють успадкування. Але в цьому випадку композиція і делегування - синоніми. У випадку з успадкуванням ми виносимо загальні методи в базовий клас Base. а різні реалізації в класи-спадкоємці Derived1. Derived2. Створюючи екземпляр одного з Derived -класів, ми отримуємо необхідну функціональність об'єкта.

Але те ж саме можна зробити і по-іншому. У класі Base ми як і раніше залишаємо загальні методи, і додаємо посилання (покажчик) (тобто аггрегіруем покажчик на реалізацію) на інтерфейс допоміжних методів IRealization. Допоміжні методи по-різному реалізуються в класах Realization1. Realization2. які успадковують * інтерфейс IRealization. Тепер в залежності від того, на об'єкт якого з класів Realization буде вказувати об'єкт Base. ми будемо отримувати різну функціональність. Base делегує свої обов'язки в IRealization.

Композиція (поряд зі спадкуванням) - це спосіб формування поведінки деякого класу. Делегування - це спосіб визначення відповідальності за деякий поведінку.

У випадку з успадкуванням, ответственноть делегується базовому і / або похідному класу. У випадку з композицією - відповідальність делегується агрегованих класів (включеним до складу вашого класу на етапі інстанціірованія). Іншими способами делегування є наприклад аспекти.

Тобто більш лаконічним відповіддю на ваше запитання буде: Композиція - це спосіб забезпечення делегування відповідальності за поведінку (функціональність). Альтернативами композиції є успадкування, аспекти і домішки.

Прикладом делегування через композицію є шаблон проектування "Стратегія", а прикладом реалізації є клас TreeMap, конструктор якого приймає як параметр Comparator, делегуючи таким чином йому відповідальність за сортування елементів.

Схожі статті