Obserwator (wzorzec projektowy)/kod
Z Wikiźródeł, repozytorium wolnych materiałów źródłowych
| Obserwator (wzorzec projektowy) Kod źródłowy |
|||
Kody źródłowe programów stosujących wzorzec projektowy obserwatora
|
[edytuj] Java
Obserwowany.java:
public interface Obserwowany { public void dodajObserwatora( Obserwator obserwator ); public void usunObserwatora( Obserwator obserwator ); public void powiadomObserwatorow(); }
Obserwator.java:
public interface Obserwator { public void uaktualnij(); }
ObserwowanyKonkretny.java:
import java.util.List; import java.util.ArrayList; public class ObserwowanyKonkretny implements Obserwowany { protected List<Obserwator> obserwatorzy = new ArrayList<Obserwator>(); private StanObserwowanego stanObserwowanego; public void dodajObserwatora( Obserwator obserwator ) { obserwatorzy.add( obserwator ); } public void powiadomObserwatorow() { Iterator<Obserwator> it = obserwatorzy.iterator(); while( it.hasNext() ) { it.next().uaktualnij(); } } public void usunObserwatora( Obserwator obserwator ) { obserwatorzy.remove( obserwator ); } public StanObserwowanego pobierzStan() { return stanObserwowanego; } }
ObserwatorKonkretny.java:
public class ObserwatorKonkretny implements Obserwator { private StanObserwatora stanObserwatora; private ObserwowanyKonkretny obserwowany; public ObserwatorKonkretny( ObserwowanyKonkretny obserwowany ) { obserwowany = obserwowany; } public void uaktualnij() { StanObserwowanego stanObserwowanego = obserwowany.pobierzStan(); // Na podstawie stanuObserwowanego ustawia stanObserwatora } }
[edytuj] C++
#include <iostream> #include <string> #include <list>
using namespace std;
Obserwator:
class Observer { public: virtual void update() = 0; };
Obserwowany:
class Observable { protected: list <Observer*> observers; public: void attach (Observer *o) { observers.push_back (o); } void detach (Observer *o) { observers.remove (o); } void notify () { list<Observer *>::iterator it; for (it = observers.begin(); it != observers.end(); it++) { (*it)->update (); } } };
Obserwowany Konkretny:
Dziedziczenie wielokrotne dostępne w C++ jest często używane w wzorcu Obserwatora
class Honey { protected: int quantity; public: Honey (int q) { quantity = q; } int getQuantity () { return quantity; } void setQuantity (int q) { quantity = q; } }; class ObservableHoney : public Observable, public Honey { string state; public: ObservableHoney (int q) : Honey(q) { } string getState () { return state; } void setState (const string& s) { state = s; cout << "Stan: " << state << endl; notify(); } };
Obserwator Konkretny:
class ObserverBear : public Observer { protected: int bearId; ObservableHoney *honey; public: ObserverBear (ObservableHoney *h, int id) { honey = h; bearId = id; } void update () { string state = honey->getState(); if (!state.compare ("Sa ludzie blisko miodu")) { cout << "Mis" << bearId << ": Czekam w ukryciu" << endl; } else if (!state.compare ("Nie ma ludzi blisko miodu")) { cout << "Mis" << bearId << ": Kradne miod" << endl; honey->setQuantity(honey->getQuantity()-1); } else if (!state.compare ("Ida ludzie")) { cout << "Mis" << bearId << ": Uciekam" << endl; } } };
Przykład użycia:
int main() { ObservableHoney honey (5); Observer *bear1 = new ObserverBear(&honey, 1); Observer *bear2 = new ObserverBear(&honey, 2); honey.attach(bear1); honey.attach(bear2); cout << "Ilosc miodu: " << honey.getQuantity() << endl; honey.setState("Sa ludzie blisko miodu"); honey.setState("Nie ma ludzi blisko miodu"); honey.setState("Ida ludzie"); cout << "Ilosc miodu: " << honey.getQuantity() << endl; delete bear1; delete bear2; return 0; }