Mediator vs Observer?

27

Czy ktoś może udzielić mi kanonicznej odpowiedzi na temat różnic między a Observeri a Mediatororaz podsumowania, kiedy powinieneś użyć jednego wzoru na drugim?

Nie jestem pewien, jakiego rodzaju sytuacji wymagałoby to, Observera jakiego rodzajuMediator

Rachel
źródło
Chciałbym poznać twój własny pomysł na ten temat po 7 latach?
Niing

Odpowiedzi:

19

W oryginalnej książce, która ukuła terminy Observer i Mediator, Design Designs, Elements of Reusable Object-Oriented Software , napisano, że wzorzec Mediator można wdrożyć za pomocą wzorca obserwatora. Można to jednak również wdrożyć, gdy Koledzy (mniej więcej odpowiadający wzorowi Tematy Observera) mają odniesienie do klasy Mediatora lub interfejsu Mediatora.

Istnieje wiele przypadków, w których chciałbyś użyć wzorca obserwatora, kluczem jest to, że obiekt nie powinien wiedzieć, jakie inne obiekty obserwują jego stan.

Mediator jest nieco bardziej szczegółowy, pozwala uniknąć komunikacji klas, ale zamiast tego za pośrednictwem mediatora. Pomaga to w zasadzie Pojedynczej Odpowiedzialności, umożliwiając odciążenie komunikacji do klasy, która po prostu to obsługuje.

Klasycznym przykładem Mediatora jest GUI, w którym naiwne podejście może prowadzić do kodu zdarzenia zdarzenia kliknięcia przycisku, mówiącego: „jeśli panel Foo jest wyłączony, a panel Bar ma etykietę„ Proszę wpisać datę ”, to nie dzwoni do serwera, w przeciwnym razie śmiało ”, gdzie według wzoru Mediatora można by powiedzieć:„ Jestem tylko guzikiem i nie mam ziemskiego interesu, wiedząc o panelu Foo i etykiecie na panelu Bar, więc po prostu zapytam mojego mediatora, czy dzwoni na serwer jest teraz OK. ”

Lub, jeśli zostanie zaimplementowany przy użyciu wzorca obserwatora, przycisk powie: „Hej, obserwatorzy (w tym mediator), mój stan się zmieni (ktoś mnie kliknął). W moim przykładzie prawdopodobnie ma to mniej sensu, ale czasem tak by było, a różnica między Obserwatorem a Pośrednikiem byłaby bardziej intencyjna niż różnica w samym kodzie.

psr
źródło
Dziękuję, twoje przykłady naprawdę pomogły mi wyjaśnić różnice między nimi. Jeśli dobrze cię rozumiem, wzorzec obserwatora używa do komunikacji systemu subskrypcji / emisji komunikatów, podczas gdy mediator jest jak jakiś globalnie dostępny byt, którego obiekty mogą zapytać o informacje.
Rachel
@Rachel - opisałbym obserwatora tak jak ty. Mediator prawdopodobnie nie jest globalny, ale jest znany wszystkim obiektom w zestawie, które komunikowałyby się ze sobą, ale teraz przechodzą przez mediator. O ile mediator nie jest zaimplementowany jako obserwator, w takim przypadku wie o wszystkich tych obiektach (przynajmniej poprzez ich obserwowalny interfejs, może bezpośrednio), ale nie wie o tym.
psr
9

Wzorzec obserwatora działa dobrze, gdy koordynacja między obserwatorami nie jest konieczna, a relacja obserwowana przebiega w jedną stronę.

Na przykład pozwól obiektom B i C obserwować obiekt A. Gdy obiekt A wyzwoli zdarzenie X, wówczas obiekt B powinien wykonać metodę Y (), a obiekt C powinien wykonać metodę Z (). Jeśli metody BY () i CZ () są całkowicie niezależne i nie wymagają koordynacji, to idź dalej i użyj wzorca obserwatora.

Z drugiej strony, jeśli BY () musi zostać wykonane przed CZ (), wówczas będziesz chciał użyć wzorca Mediator, w którym mediator obejmuje tę koordynację. W tym scenariuszu mediator M obserwowałby obiekt A i miałby odniesienia do obiektów B i C. Gdy A wyzwala zdarzenie X, M obsłuży to zdarzenie i wywoła BY () i CZ () w ustalonej kolejności.

Ponadto, jeśli obiekty A, B i C muszą się wzajemnie obserwować, to użycie mediatora jako pośrednika przejdzie długą drogę do oddzielenia tych obiektów i uniknięcia kodu spaghetti.

Raymond Saltrelli
źródło
5

ObserverWzór jest stosowany, gdy działanie wykonane w jednej klasy (obserwowana klasa) musi produkować reakcji do innej klasy (The klasy obserwacji), ale nie jest pożądane, obserwowana klasy być sprzężone z klasą obserwacyjnych. To bardzo powszechny wzór. Parser SAX XML może być dobrym przykładem. Aby użyć analizatora składni SAX, klient implementuje ContentHandlerinterfejs do „obserwowania” działania analizatora składni. Gdy parser napotka elementy dokumentu XML, wywołuje metody ContentHandler. Analizator składni może wywoływać kod klienta, ale analizator składni nie jest sprzężony z kodem klienta.

MediatorWzór jest hermetyzacja strukturze użytkowania zestawu przedmiotów. Kod klienta jest sprzężony tylko z mediatorem, a nie z wieloma innymi klasami. Jest podobny do agregacji, z tym wyjątkiem, że czas życia zamkniętych obiektów jest niezależny od czasu życia mediatora.

Kevin Cline
źródło
1

W prostych słowach (których używam do zapamiętania):

Obserwator: Użyj, gdy jeden obiekt chce być informowany o zmianach stanu w innym (ściśle mówiąc, używanie zdarzeń to Obserwator)

Aby zrozumieć mediatora, uważam, że łatwiej jest, jeśli weźmiesz pod uwagę Facade: Facade agreguje funkcjonalność oddzielnych klas (czasami całych podsystemów) i zapewnia tę funkcjonalność w jednym interfejsie.

Mediator: Taki sam jak Facade, z tym wyjątkiem, że łączy funkcjonalność wszystkich klas agregatów w celu uzyskania nowej funkcjonalności. (Dobre wyjaśnienie tutaj )

Steven Evers
źródło