Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Previous revision Next revision | Previous revision | ||
obserwator [2008/04/14 13:53] wojtek-j |
obserwator [2008/04/14 14:05] wojtek-j |
||
---|---|---|---|
Linia 1: | Linia 1: | ||
======Wzorzec Projektowy Obserwator====== | ======Wzorzec Projektowy Obserwator====== | ||
- | Wzorzec Obserwatora (ang. The Observer Pattern) jest wzorcem projektowym służącym do obserwowania stanu obiektu. Wzorzec ten jest pomyślany do rozwiązania sytuacji w której stan większej liczby obiektów (obserwatorów) zależy od stanu innego obiektu (obserwowanego) - pomaga zachować spójność między nimi. | + | Wzorzec Obserwatora (ang. The Observer Pattern) jest wzorcem projektowym służącym do obserwowania stanu obiektu. Wzorzec ten jest pomyślany do rozwiązania sytuacji w której stan większej liczby obiektów (obserwatorów) zależy od stanu innego obiektu (obserwowanego) - pomaga zachować spójność między nimi. W ogólnym przypadku działanie jego polega na rejestrowaniu przez obiekt obserwowany obiektów go obserwujących (Obserwatorów), a następnie po zmianie swojego stanu powiadomieniu wszystkich Obserwatorów o tym fakcie tak, aby każdy z nich mógł odpowiednio zaktualizować swój stan. Wzorzec jest szczególnie przydatny w przypadkach gdy rodzaj i ilość obserwatorów nie jest znana lub zmienna. |
=====Diagram UML===== | =====Diagram UML===== | ||
- | {{ observer:uml_1.jpg |}} | + | {{ observer:uml1.jpg |}} |
=====Opis elementów wzorca===== | =====Opis elementów wzorca===== | ||
W skład wzorca wchodzą cztery elementy: | W skład wzorca wchodzą cztery elementy: | ||
Linia 9: | Linia 9: | ||
* //usun//- usuwa obserwatora | * //usun//- usuwa obserwatora | ||
* //powiadom//- powiadamia o zmianie wszystkich obserwatorow z listy poprzez wołanie metody odswież dla każdego z nich | * //powiadom//- powiadamia o zmianie wszystkich obserwatorow z listy poprzez wołanie metody odswież dla każdego z nich | ||
- | - **Obserwowany Konkretny**: Klasa zwraca swój wewnętrzny stan, który jest obiektem zainteresowania obserwatorów. Powiadamia także swoich obserwatorów na wypadek zmiany swojego stanu. Zawiera: | + | - **[[obserwator#Obserwowany Konkretny|Obserwowany Konkretny]]**: Klasa zwraca swój wewnętrzny stan, który jest obiektem zainteresowania obserwatorów. Powiadamia także swoich obserwatorów na wypadek zmiany swojego stanu. Zawiera: |
* //podaj_stan// - zwraca aktualny stan obiektu | * //podaj_stan// - zwraca aktualny stan obiektu | ||
- | - **Abstrakcyjny Obserwator**: Klasa abstrakcyjna dostarczająca interfejs dla powiadamiania dla wszystkich obserwatorów. Zawiera: | + | - **[[obserwator#Abstrakcyjny Obserwator|Abstrakcyjny Obserwator]]**: Klasa abstrakcyjna dostarczająca interfejs dla powiadamiania dla wszystkich obserwatorów. Zawiera: |
* //odswiez// - abstrakcyjna metoda która ma być nadpisana przez konkretnego obserwatora | * //odswiez// - abstrakcyjna metoda która ma być nadpisana przez konkretnego obserwatora | ||
- | - **Obserwator konkretny**: Klasa pozostaję w związku z obiektem obserwowanym (ObserwowanyKonkretny) aby otrzymać/pobrać jego stan w wypadku powiadomienia o zmienie. Zawiera: | + | - **[[obserwator#Obserwator konkretny|Obserwator konkretny]]**: Klasa pozostaję w związku z obiektem obserwowanym (ObserwowanyKonkretny) aby otrzymać/pobrać jego stan w wypadku powiadomienia o zmienie. Zawiera: |
* //odswiez// - podczas wołania tej metody (która nadpisuje metode abstrakcyjną w klasie bazowej), konkretny obserwator woła podaj_stan dla obiektu obserwowanego aby zaktualizować informację o nim | * //odswiez// - podczas wołania tej metody (która nadpisuje metode abstrakcyjną w klasie bazowej), konkretny obserwator woła podaj_stan dla obiektu obserwowanego aby zaktualizować informację o nim | ||
=====Kod w C++===== | =====Kod w C++===== | ||
Linia 24: | Linia 24: | ||
*/ | */ | ||
void dodaj(Obserwator* o) { | void dodaj(Obserwator* o) { | ||
- | + | //dodaj obserwatora o do listy obserwatorow | |
} | } | ||
/** | /** | ||
Linia 30: | Linia 30: | ||
*/ | */ | ||
void powiadom(){ | void powiadom(){ | ||
- | /* dla każdego o w obserwatorzy wywołaj o->odswiez() */ | + | //dla każdego o w obserwatorzy wywołaj o->odswiez() |
} | } | ||
/** | /** | ||
Linia 53: | Linia 53: | ||
*/ | */ | ||
StanObserwowanego podaj_stan() { | StanObserwowanego podaj_stan() { | ||
- | return *stan_; | + | //zwroc stan_ |
} | } | ||
private: | private: |