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] (aktualna) 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: | ||