Narzędzia użytkownika

Narzędzia witryny


obserwator

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
obserwator [2008/04/14 13:07]
wojtek-j
obserwator [2008/04/14 13:42]
wojtek-j
Linia 4: Linia 4:
 {{ observer:​uml_1.jpg |}} {{ observer:​uml_1.jpg |}}
 =====Kod w C++===== =====Kod w C++=====
 +  * **Abstrakcyjny Obserwowany**
 <code cpp> <code cpp>
-//​Abstrakcyjny Obserwowany 
 class Obserwowany { class Obserwowany {
  public:  public:
 +/* dodaj obserwatora o do listy obserwatorow */
  void dodaj(Obserwator* o) {  void dodaj(Obserwator* o) {
- /* dodaj obserwatora o do listy obserwatorow */ 
  }  }
  void powiadom(){  void powiadom(){
Linia 19: Linia 19:
 }; };
 Subject::​~Subject(){} Subject::​~Subject(){}
 +</​code>​
 +<code cpp>
 //​Obserwowany konkretny //​Obserwowany konkretny
 class ObserwowanyKonkretny : public Obserwowany { class ObserwowanyKonkretny : public Obserwowany {
Linia 57: Linia 59:
   * jeden z istniejących obiektów musi zostać zamieniony na inny (np. innej klasy)   * jeden z istniejących obiektów musi zostać zamieniony na inny (np. innej klasy)
   * musimy usunąć jeden z obiektów   * musimy usunąć jeden z obiektów
-Wygodnym sposobem jest utrzymywanie niezależnych obiektów współpracyjących ze sobą bez wiedzy o swoim istnieniu - tak działa **Wzorzec Obserwatora**.+Wygodnym sposobem jest utrzymywanie niezależnych obiektów współpracujących ze sobą bez wiedzy o swoim istnieniu - tak działa **Wzorzec Obserwatora**
 +=====Działanie===== 
 +Gdy zmienia się stan obiektu obserwowanego,​ odpowiednio powinien zmienić się stan obserwatorów. Istnieją dwa mechanizmy propagacji zmian stanu obiektu obserwowanego:​ [[obserwator#​Powiadamianie|Powiadamianie]] oraz [[obserwator#​Polling|Polling]]. 
 +====Powiadamianie==== 
 +Po zmianie swojego stanu obiekt obserwowany powiadamia obserwatorów (metoda powiadom) o tym fakcie, po czym obserwatorzy pobierają informację o zmianach wywołując metodę podaj_stan na obiekcie obserwowanym. Podczas tej procedury należy zadbać o dwa istotne fakty: 
 +  * aby obiekt obserwowany pozostał spójny po powiadomieniu obserwatorów\\ istotne jest, aby zapewnić stabilność stanu obiektu obserwowanego przed i po powiadomieniu obserwatorów tak, aby każdy obserwator otrzymał tę samą informację o stanie obiektu obserwowanego  
 +  * aby uniknąć redundantnych powiadomień podczas całego procesu zmiany stanu\\ powiadamianie obserwatorów o każdej zmianie stanu obiektu obserwowanego nieraz jest niepotrzebne,​ zamiast tego lepszym wyjściem jest wysłanie jednego powiadomienia po całej grupie zmian jakie nastąpiły 
 +Mechanizm ten jest prosty i oczywisty w wielu zastosowaniach,​ co czyni go najpowszechniejszym. 
 +====Polling==== 
 +W tym mechanizmie,​ obiekt obserwowany nie powiadamia obserwatorów o zmianie swojego stanu, zamiast tego obserwatorzy odpytują obiekt obserwowany o jego stan. Plusem jest kompletna niezależność obiektu obserwowanego od obserwatorów,​ trzeba jednak zadbać o to aby odpytywać obiekt obserwowany w odpowiednim momencie - w szczególności nie za często aby uniknąć pustych akcji (żadne zmiany nie nastąpiły) ani nie za rzadko (zmiany mogły nastąpić kilkukrotnie). 
 +====Interakcje==== 
 +Istnieją dwa modele interakcji pomiędzy obiektem obserwowanym a obserwatorami:​ 
 +  * **Push Model**\\ W tym modelu, obiekt obserwowany podaje zmiany swojego stanu obserwatorom. Model ten może zostać użyty gdy wszyscy obserwatorzy polegają na tych samych zmianach, obserwator po prostu odbiera wszystkie dane jakie dostaje od obiektu obserwowanego. Model ten nie jest wskazany podczas przekazywania dużej ilości danych podczas gdy każdy obserwator potrzebuje innej małej porcji danych. 
 +  * **Pull Model**\\ W tym modelu obserwatorzy sami pobierają potrzebne dane od obiektu obserwowanego. Model ten jest bardziej elastyczny, ponieważ obserwatorzy mogą pobrać tylko potrzebne dane. 
 +=====Podsumowanie===== 
 +Wzorzec obserwatora pozwala uniknąć niepotrzebnych (nieraz uciążliwych albo niemożliwych) bezpośrednich interakcji pomiędzy obiektami. Przykładem takiej sytuacji jest problem w którym nie znamy ilości obiektów które pozostaną w zależności lub też ilość ta może ulegać zmianie. Przy wykorzystaniu tego wzorca dodawanie i usuwanie obserwatorów nie stanowi problemu. 
 + 
 +W większości przypadków,​ obserwatorzy zostaną tylko powiadomieni o zmianach. Znaczy to, że sami będą musieli je rozpoznać i ocenić czy ich dotyczą, co jednak może zostać rozwiązane poprzez umieszczanie odpowiedniej informacji w powiadomieniu. 
 + 
 +Obiekty obserwatorów są od siebie zupełnie niezależne,​ natomiast wszystkie polegają na stanie obiektu obserwowanego,​ toteż należy zwrócić uwagę na zmiany stanu obiektu obserwowanego jakie mogą zostać wywołane przez obserwatora,​ zwłaszcza podczas wykonywania przez niego metody //​odswiez//​. Sytuacja taka pociąga za sobą jeszcze jedno niebezpieczeństwo,​ otóż jeśli zmiana stanu obiektu obserwowanego następuję w metodzie //​odswiez//,​ bardzo łatwo o kolejne powiadomienie a co za tym idzie kolejne wywołania metody //odswiez// - co w takim wypadku prowadzi do rekurencji. 
 + 
 +Jako że nie istnieje jawna interakcja pomiędzy obiektem obserwowany a obserwatorami,​ łatwo doprowadzić do sytuacji w której obiekt obserwowany przestaje być tym czym był do tej pory (w szczególności zostaje usunięty) bez podania odpowiedniej informacji do obserwatorów.
obserwator.txt · ostatnio zmienione: 2008/04/14 14:05 przez wojtek-j