Obserwator (wzorzec projektowy)/kod

Z Wikiźródeł, repozytorium wolnych materiałów źródłowych
Skocz do: nawigacji, wyszukiwania


Obserwator (wzorzec projektowy) • Kod źródłowy
Obserwator (wzorzec projektowy)
Kod źródłowy
Kody źródłowe programów stosujących wzorzec projektowy obserwatora
Wikipedia
Zobacz w Wikipedii hasło Obserwator

[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;
}
Osobiste
Przestrzenie nazw

Warianty
Działania
Nawigacja
Dla edytorów
Drukuj lub eksportuj
Narzędzia