Narzędzia użytkownika

Narzędzia witryny


obserwator

To jest stara wersja strony!


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.

Diagram UML

Kod w C++

//Abstrakcyjny Obserwowany
class Obserwowany {
	public:
	void dodaj(Obserwator* o) {
		/* dodaj obserwatora o do listy obserwatorow */
	}
	void powiadom(){
		/* dla każdego o w obserwatorzy wywołaj o->odswiez() */
	}
	virtual ~Obserwowany() = 0;
	private:
	std::vector<Obserwator*> obserwatorzy;
};
Subject::~Subject(){}
//Obserwowany konkretny
class ObserwowanyKonkretny : public Obserwowany {
	public:
	void podaj_stan(StanObserwowanego* stan) {
 		/* podaj stan, np. poprzez odpowiednia struktore StanObserwowanego */
	}
};
//Abstrakcyjny Obserwator
class Obserwator {
	public:
	virtual void odswiez() = 0;
	virtual ~Obserwator(){}
};
//Obserwator konkretny
class ObserwatorKonkretny : public Obserwator {
	public:
	void odswiez() {
		/* uzyskaj aktualny stan obserwowanego */
	}
};

Opis elementów wzorca

W skład wzorca wchodzą cztery elementy:

  1. Obserwowany: Klasa abstrakcyjna dostarczająca interfejs dla dodawania i usuwania obserwatorów, oraz powiadamiania o zmianie stanu wszystkich obserwatorów z listy. Zawiera:
    • dodaj- dodaje obserwatora
    • usun- usuwa obserwatora
    • powiadom- powiadamia o zmianie wszystkich obserwatorow z listy poprzez wołanie metody odswież dla każdego z nich
  2. 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
  3. Obserwator: Klasa abstrakcyjna dostarczająca interfejs dla powiadamiania dla wszystkich obserwatorów. Zawiera:
    • odswiez - abstrakcyjna metoda która ma być nadpisana przez konkretnego obserwatora
  4. 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

Typowe użycie

Dla przykładu weźmy dwa obiekty A oraz B, przy czym stan obiektu A jest zależny od stanu obiektu B, czyli może się zdarzyć że po zmianie stanu obiektu B obiekt A również powinien zmienić swój stan. W tym ogólnym (i prostym) przypadku można pokusić się o bezpośrednią interakcje pomiędzy obiektami poprzez utrzymanie w jednym z nich wskaźnika lub referencji na drugi. Sytuacja jednak komplikuje się kiedy:

  • do zależności dochodzi nowy obiekt
  • jeden z istniejących obiektów musi zostać zamieniony na inny (np. innej klasy)
  • 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.

obserwator.1208171224.txt.gz · ostatnio zmienione: 2008/04/14 13:07 przez wojtek-j