Observer¶
Przeznaczenie
Określa zależność jeden-do-wiele między obiektami
Gdy jeden obiekt zmienia stan, wszystkie obiekty od niego zależne są o tym automatycznie powiadamiane i uaktualniane
Kontekst
Zmiana stanu jednego obiektu wymaga zmiany innych i nie wiadomo, ile obiektów trzeba zmienić
Problem
Obiekt powinien być w stanie powiadamiać inne obiekty, nie przyjmując żadnych założeń co do tego, co te obiekty reprezentują – wynikiem są luźniejsze powiązania między obiektami
Struktura¶

Uczestnicy¶
Subject
zna swoich obserwatorów
może go obserwować dowolna liczba obserwatorów
zapewnia interfejs dołączania i odłączania obserwatorów
Observer
definiuje interfejs uaktualniania się obiektów, które powinny być powiadamiane o zmianach, jakie zaszły w obserwowanym obiekcie
ConcreteSubject
przechowuje stan, który interesuje obiekty typu ConcreteObserver
gdy zmienia się jego stan wysyła powiadomienia do swoich obserwatorów
ConcreterObserver
utrzymuje odwołania do obiektu ConcreteSubject
przechowuje stan, który powinien być spójny ze stanem obserwowanego
implementuje interfejs obserwatora służący do uaktualniania stanu
Współpraca¶
ConcreteSubject zawsze powiadamia swoich obserwatorów, gdy wystąpi zmiana, która może doprowadzić do niespójności jego stanu ze stanem obserwatora
Po otrzymaniu powiadomienia o zmianie, która wystąpiła w obserwowanym obiekcie, ConcreteObserver może zapytać go o informacje dotyczące tej zmiany. Obserwator używa tych informacji do uaktualnienia swojego stanu.
Konsekwencje¶
Abstrakcyjne powiązanie między obiektem obserwowanym a obserwatorem. Obserwowany wie, że ma listę obserwatorów, z których każdy dostosowuje się do interfejsu klasy Observer. Obserwowany i obserwator mogą należeć do różnych warstw abstrakcji w systemie.
Wsparcie dla rozsyłania komunikatów. Powiadomienie jest automatycznie nadawane do wszystkich zainteresowanych obiektów, które je zaprenumerowały.
Nieoczekiwane uaktualnienia. Pozornie nieszkodliwa operacja dotycząca obiektu obserwowanego może spowodować kaskadę uaktualnień w obserwatorach i obiektach od nich zależnych.
Implementacja¶
Obserwowanie więcej niż jednego obserwowanego. Obserwowany może po prostu przekazać siebie jako argument operacji Update(), informując w ten sposób obserwatora, którego obserwowanego powinien sprawdzić.
Zagwarantowanie, że przed rozesłaniem powiadomienia stan obserwowanego jest wewnętrznie spójny.
Przesyłanie informacji o zmianie do obserwatora – dwa modele:
Model push – obserwowany wysyła szczegółową informację o zmianie (bez względu, czy obserwatorzy tego chcą, czy nie)
Model pull – obserwowany nie wysyła niczego poza powiadomieniem, a obserwatorzy jawnie pytają potem o szczegóły
Nie można uzależniać poprawnego funkcjonowania aplikacji od określonej kolejności powiadamiania przesyłanego do obiektów obserwujących.
Podsumowanie¶
Umożliwia obiektom dynamiczne rejestrowanie zależności między obiektami, dzięki czemu obiekty mogą powiadamiać swoje obiekty zależne o istotnych zmianach swoich stanów.
Obiekty obserwujące są luźno powiązane z obiektem obserwowanym – obiekt obserwowany wie o nich tylko tyle, że posiadają zaimplementowany interfejs klasy Observer.
Informacje o zmianach stanu obiektu obserwowanego mogą być wysyłane lub pobierane.