czwartek, 14 lutego 2013

Obserwator

Rolą wzorca Obserwator (Observer/Listener) jest asynchroniczne powiadamianie o zmianach stanu obiektów. W tym celu wzorzec definiuje relację między obiektami typu "jeden do wielu". Dzięki temu zmiana stanu (atrybutu) obiektu obserwowanego wiąże się z powiadomieniem o niej wszystkich powiązanych obiektów - obserwatorów. Obiekt obserwowany jest zarządcą swoich danych i informuje on powiązanych obserwatorów o zamianach w nich zachodzących. Można by powidzieć, że wzorzec obserwator przydaje się w sytuacji, gdy modyfikacja stanu jednego obiektu wpływa na inne elementy systemu.


Struktura

 

 

Uczestnicy

Uczestnikami wzorca Obserwator są dwa typy obiektów:
  • obiekt obserwowany,
  • obiekt obserwujący (obserwator).
Obiekt obserwowany posiada listę zarejestrowanych obserwatorów. Może do niej dodawać nowe i usuwać istniejące obiekty obserwujące jego stan. Obiekt obserwowany, w chwili zmiany swojego stanu, powiadamia o tym obiekty go obserwujące poprzez wywołanie odpowiedniej metody, np. powiadomObserwatorów(). Jeden obserwator może monitorować stan kliku różnych obiektów, a jeden obiekt obserwowany może być monitorowany przez kilku obserwatorów.

Strategie informowania o zmianach:
  • wypychanie - obiekt obserwowany przekazuje w argumencie referencję do samego siebie, pozwalając na samodzielne wyciąganie niezbędnych informacji;
  • wyciąganie - obiekt obserwowany przygotowuje listę zmian w określonym formacie (np. jako dodatkowy obiekt) i przekazuje ją jako parametr wywołania do obserwatorów.

 

Konsekwencje stosowania

Zalety:
  • luźniejsze powiązania między obiektami obserwowanymi i obserwującymi - mogą być niezależnie od siebie modyfikowane;
  • relacje między obiektami obserwowanymi i obserwującymi są tworzone i modyfikowane dynamicznie w trakcie działania kodu;
  • obserwator decyduje o obsłudze powiadomień.
Wady:
  • domyślnie, obiekt obserwowany powiadamia wszystkich zarejestrowanych obserwatorów o zmianach (niezależnie od tego, czy zmiana dotyczy merytorycznie obserwatora).

 

Zastosowanie

  • wszędzie tam, gdzie jeden obiekt jest uzależniony od stanu drugiego obiektu.  

 

Przykład

Przykładem zastosowania wzorca Obserwator może być implementacja mechanizmu prezentacji graficznej paska postępu np. przy kopiowaniu plików lub ściągania danych z sieci. W tej sytuacji obserwator regulujący prezentację graficzną postępu zostaje powiadamiany o tym ile bajtów już skopiowano/pobrano. 

Innym przykładem może być komunikator internetowy, który obsługuje powiadamianie o dostępności użytkowników w sieci i prezentacji statusu dostępności za pomocą odpowiednich ikon graficznych.

Obserwator może być także stosowany w wykresach statystyczne, które są zależne od zmieniających się parametrów.

Źródła


Brak komentarzy:

Prześlij komentarz