Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Previous revision | Next revision Both sides next revision | ||
obserwator [2008/04/14 13:28] 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 73: | Linia 75: | ||
=====Podsumowanie===== | =====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. | 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. | 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. | 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. | 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. |