Це стара публікація, але я все одно передзвоню, тому що інші відповіді не стосуються того, що відбувається при використанні будь-якого зразка, вони, здається, більше стосуються теорії, ніж практики.
Як працюють делегація та спостерігач
За допомогою делегації делегатор визначає саме того, хто буде реагувати на певну подію в момент створення джерела потенційної події. Ви можете подумати про цього слухача як про одного спостерігача . У випадку шаблону спостерігача спостерігач вибирає того, кого він спостерігає, коли йому здається, що він любить; тому залежності залежно від спостереження проти делегування. З оглядовим малюнком вважайте газету та передплатників як спостерігачів. Спостерігачі контролюють, коли стосунки будуть створені. З делегацією подумайте працівника та роботодавця. Роботодавець контролює, коли створюються відносини та хто саме відповідає за конкретні події. Співробітники не можуть вибрати, над якими завданнями вони працюють ... загалом.
Деяка аргументація делегації може мати одного спостерігача, але я думаю, що реальна різниця між ними полягає в тому, як призначається обробка подій. Ви ніколи не побачите реєстру делегатів події. Він ніколи не дізнається, що навіть керує подією, поки це не відбудеться, і делегатор не зателефонує на публічний метод.
Перевага делегації
Ця модель є дуже жорсткою, і більшість звичайних конструкцій є більш простими і, як правило, більш надійними. Це змушує вас оголосити обробника події вперед на момент ініціалізації джерела потенційної події. Якщо вам потрібен хтось, щоб керувати трафіком, ви призначаєте директора дорожнього руху, перш ніж відкривати вулицю. Що стосується спостерігача, то ви дозволяєте дорожньому поліцейському обирати, коли направляти рух в будь-який час, коли він чи вона відчує це.
Недоліки делегації
Недоліком цієї конструкції є те, що вона не є гнучкою. Якщо ви реалізовували якийсь код для передплати газети, газета / делегатор повинні були б точно визначити, хто може читати новини, вдруге вони створені. За шаблоном спостерігачів вони можуть бути зареєстровані пізніше в будь-який час, і в газеті потрібно буде лише знати, що підписалася нова особа.
Коли вибрати делегацію?
Коли вам потрібні один конкретний спостерігач (і), і немає жодних підстав для того, щоб змінити того, хто спостерігає, то жорсткий дизайн структури делегування буде корисним.
Наприклад, вам потрібен клас / об'єкт для обробки спливаючого вікна для певної помилки. Існує не так багато причин, чому під час запуску вам потрібно буде переключити, хто обробляє конкретну помилку, тому делегування помилки "поза пам'яттю" одному об'єкту було б сенсом. Створення масиву потенційних обробників, а потім реєстрація цих обробників для помилки "Поза пам'яті" не мала б особливого сенсу; це може бути прикладом використання шаблону спостерігачів у цій ситуації. Під час запуску ви можете змінити, які методи викликаються або що викликається "делегатом" для змінних подій, але замінити обробник подій на конкретну подію під час виконання не є звичайним.
Не можливо неможливо замінити делегатів, як ви робили за схемою спостерігачів, її просто складно. У реальному світі, можливо, ви хочете поміняти дорожні служби, щоб новий делегатор обробляв трафік. Можна стверджувати, що кращий дизайн зробив би оригінальним делегатом міліцію, а не одного міліціонера, але я відхилився ...