Посередник проти спостерігача?


27

Чи може хтось надати мені канонічну відповідь на відмінності між a Observerі a Mediator, а також підсумок, коли слід використовувати один шаблон над іншим?

Я не впевнений у тому, яка ситуація потребувала б Observerта яку саме ситуацію потребуватимеMediator


Я хотів би знати вашу власну думку про це через 7 років?
Нінг

Відповіді:


19

В оригінальній книзі, в якій були введені терміни «Спостерігач і посередник», « Шаблони дизайну», «Елементи багаторазового об’єктно-орієнтованого програмного забезпечення», йдеться про те, що модель «Посередник» може бути реалізована за допомогою шаблону спостерігача. Однак це також може бути реалізовано, якщо колеги (приблизно еквівалентні суб'єктам шаблону спостерігача) мають посилання на клас посередника або інтерфейс посередника.

Існує багато випадків, коли ви хочете використовувати шаблон спостерігача, але ключовим є те, що на об'єкті не слід знати, які інші об'єкти спостерігають його стан.

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

Класичний приклад посередника - це графічний інтерфейс, де наївний підхід може призвести до коду на події натискання кнопки, що говорить: "Якщо панель Foo вимкнена, а панель" Bar "має ярлик" Будь ласка, введіть дату ", тоді не дзвоніть на сервер, інакше йти вперед ", де за шаблоном" Медіатор "могло сказати:" Я просто кнопка і не маю жодного земного бізнесу, знаючи про панель Foo та ярлик на панелі "Бар", тому я просто попрошу свого посередника, якщо дзвонить на сервер зараз добре ».

Або, якщо вона реалізована за допомогою шаблону спостерігача, кнопка буде відповідати "Ей, спостерігачі (до якої слід віднести посередника), мій стан змінився (хтось натиснув на мене). Зроби щось про це, якщо тебе хвилює". У моєму прикладі це, мабуть, має менший сенс, але іноді це було б, і різниця між спостерігачем та посередником була б більшою мірою, ніж різницею в самому коді.


Дякую, ваші приклади справді допомогли з’ясувати відмінності між ними. Якщо я правильно вас розумію, модель спостереження використовує систему підписки / трансляції повідомлень для спілкування, тоді як посередник - це як деяка глобально доступна сутність, об'єкти якої можуть запитувати інформацію.
Рейчел

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

9

Шаблон спостерігача добре працює, коли координація між спостерігачами не потрібна, і спостережливі відносини йдуть в одну сторону.

Наприклад, нехай об'єкти B і C спостерігають за об'єктом A. Коли об'єкт A спрацьовує подія X, тоді об'єкт B повинен виконати метод Y (), а об'єкт C повинен виконати метод Z (). Якщо методи BY () та CZ () абсолютно незалежні і не потребують узгодження, то продовжуйте використовувати схему спостерігачів.

З іншого боку, якщо BY () повинен бути виконаний перед CZ (), тоді ви хочете використовувати шаблон посередника, де посередник інкапсулює цю координацію. У цьому випадку медіатор M буде спостерігати за об'єктом A і матиме посилання на об'єкти B і C. Коли A спрацьовує подія X, M буде обробляти подію та викликати BY () та CZ () у встановленому порядку.

Крім того, якщо об'єкти A, B і C потребують спостереження один за одним, тоді використання посередника в якості посередника пройде довгий шлях, щоб розв'язати ці об'єкти і уникнути коду спагетті.


5

ObserverШаблон використовується , коли дія , що вживаються на одному класі (спостережуваний клас) повинен провести реакцію в іншому класі (клас спостережень) , але це небажано для спостережуваного класу бути пов'язаний з класом спостереження. Це дуже поширена закономірність. SAX XML-аналізатор може бути хорошим прикладом. Щоб використовувати SAX-аналізатор, клієнт реалізує ContentHandlerінтерфейс для "спостереження" за процесом аналізатора. Як аналізатор стикається з елементами документа XML, він викликає методи ContentHandler. Аналізатор може викликати код клієнта, але аналізатор не пов'язаний з кодом клієнта.

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


1

Простіше кажучи (я використовую його для запам'ятовування):

Спостерігач: використовуйте, коли один об'єкт хоче отримувати інформацію про зміни стану в іншому (строго кажучи, використовуючи події, це спостерігач)

Для того, щоб зрозуміти посередника, мені легше, коли спочатку розглянемо Фасад: Фасад агрегує функціональність окремих класів (іноді цілих підсистем) і надає цю функціональність в єдиному інтерфейсі.

Посередник: Те саме, що і Фасад, за винятком того, що він поєднує функціональність усіх сукупних класів для створення нових функціональних можливостей. (Хороше пояснення тут )

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.