Kody źródłowe/Obserwator (wzorzec projektowy)

Z Wikibooks, biblioteki wolnych podręczników.
Przejdź do nawigacji Przejdź do wyszukiwania


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

Java[edytuj]

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 ) {
		this.obserwowany = obserwowany;
	}
	
	public void uaktualnij() {	
		StanObserwowanego stanObserwowanego = obserwowany.pobierzStan();
		// Na podstawie stanuObserwowanego ustawia stanObserwatora
	}

}

C++[edytuj]

#include <iostream>
#include <string>
#include <list>


Obserwator:

class Obserwator {
public:
    virtual void update() = 0;
};

Obserwowany:

class Obserwowany {
protected:
    std::list <Obserwator*> obserwatorzy;
public:
    void dodaj(Obserwator *o) {
        obserwatorzy.push_back (o);
    }
    void usun(Obserwator *o) {
        obserwatorzy.remove (o);
    }
 
    void powiadom () {
        std::list<Obserwator *>::iterator it;
        for (it = obserwatorzy.begin(); it != obserwatorzy.end(); it++) {
            (*it)->update ();
        }
    }
};

Obserwowany Konkretny:

Dziedziczenie wielokrotne dostępne w C++ jest często używane w wzorcu Obserwatora

class Miod {
protected:
    int ilosc;
public:
    Miod (int q) {
        ilosc = q;
    }
 
    int pobierzIlosc () {
        return ilosc;
    }
 
    void ustawIlosc (int q) {
        ilosc = q;
    }
};
 
class ObserwowanyMiod : public Obserwowany, public Miod {
    std::string stan;
public:
    ObserwowanyMiod (int q) : Miod(q) {
    }
 
    std::string pobierzStan () {
        return stan;
    }
 
    void ustawStan (const std::string& s) {
        stan = s;
        std::cout << "Stan: " << stan << std::endl;
        powiadom();
    }
};


Obserwator Konkretny:

class ObserwatorMis : public Obserwator {
protected:
    int misId;
    ObserwowanyMiod *miod;
public:
    ObserwatorMis (ObserwowanyMiod *h, int id) {
        miod = h;
        misId = id;
    }
    void update () {
        std::string stan = miod->pobierzStan();
        if (!stan.compare ("Sa ludzie blisko miodu")) {
            std::cout << "Mis" << misId << ": Czekam w ukryciu" << std::endl;
        } else if (!stan.compare ("Nie ma ludzi blisko miodu")) {
            std::cout << "Mis" << misId << ": Kradne miod" << std::endl;
            miod->ustawIlosc(miod->pobierzIlosc()-1);
        } else if (!stan.compare ("Ida ludzie")) {
            std::cout << "Mis" << misId << ": Uciekam" << std::endl;
        }
    }
};


Przykład użycia:

int main() {
    ObserwowanyMiod miod (5);
    Obserwator *mis1 = new ObserwatorMis(&miod, 1);
    Obserwator *mis2 = new ObserwatorMis(&miod, 2);
 
    miod.dodaj(mis1);
    miod.dodaj(mis2);
 
    std::cout << "Ilosc miodu: " << miod.pobierzIlosc() << std::endl;
 
    miod.ustawStan("Sa ludzie blisko miodu");
    miod.ustawStan("Nie ma ludzi blisko miodu");
    miod.ustawStan("Ida ludzie");
 
    std::cout << "Ilosc miodu: " << miod.pobierzIlosc() << std::endl;
    delete mis1;
    delete mis2;
    return 0;
}