algorytm.org

Implementacja w C/C++

Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Obserwator (observer) - Implementacja w C/C++
Ocena użytkownikóww: *****  / 10
SłabyŚwietny
Nadesłany przez Krzysiek Łopucki, 12 września 2012 10:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

obserwator.cpp:
/****************************************
*   Wzorzec Projektowy Observer         *
*   (obserwator)                        *  
*   www.algorytm.org                    *
*   Opracowal Krzysztof Łopucki         *
*                                       *
*****************************************/




#include <iostream>
#include <string>
#include <list>
#include <unistd.h>

#define _ZMNIJSZANIE_CISNIENIA_ 6
#define _ZMNIJSZANIE_CISNIENIA_2_ 6

using namespace std;

class pacjent; //TAKA KLASE SOBIE STWORZE
// TO JEST MOJ OBSERWATOR
class miernik{
	public:
		//virtual ~miernik();
		virtual void update(pacjent*) = 0;
};

// OSOBA OBSERWOWANA - PACJENT
class pacjent{
	private:
		//string name , surname;
		list<miernik*> mierniki;
	public:
		virtual ~pacjent(){}
		virtual void attach(miernik* m){
			mierniki.push_back(m);
		}
		virtual void detach(miernik* m){
			mierniki.remove(m);
		}
		virtual void notify(){
			list<miernik*>::iterator it = mierniki.begin();
			for( ; it != mierniki.end(); it++){
				(*it)->update(this);
			}
		}
};

//OBSERWATOR
class Pacjent : public pacjent{
	private:
		int cisnienie1 ;
		int cisnienie2 ;
	public:
		Pacjent() {cisnienie1 = 60; cisnienie2 = 30;}
		void ustaw(){
			cisnienie1 += _ZMNIJSZANIE_CISNIENIA_;
			cisnienie2 += _ZMNIJSZANIE_CISNIENIA_2_;
		}
		void ustaw(int a, int b){
			if(a == 0)
				cisnienie1 = b;
			else
				cisnienie2 = b;
		}
		int getcisnienie1(){
			return cisnienie1;
		}
		int getcisnienie2(){
			return cisnienie2;
		}
};

class cisnieniomierz: public miernik{
	public:
		virtual void update(pacjent* pac){
			Pacjent *m = dynamic_cast<Pacjent *>(pac);
			if (m) {
				cout << "Cisnienie skurczowe = " << m->getcisnienie1() << endl;
				if(m->getcisnienie1() > 90){
					cout << "Cisnienie skurczowe zbyt wysokie. ... odpoczywam:" << endl;
					m->ustaw(0,60);
					sleep(2);
					this->update(pac);
				}
			}
		}
};


class cisnieniomierz2: public miernik{
	public:
		virtual void update(pacjent* pac){
			Pacjent *m = dynamic_cast<Pacjent *>(pac);
			if(m){
				cout<< "Cisnienie rozkurczowe = " << m->getcisnienie2() << endl;
				if(m->getcisnienie2() > 60){
					cout << "Cisnienie rozkurczowe zbyt wysokie. ... odpoczywam:" << endl;
					m->ustaw(1,30);
					sleep(2);
					this->update(pac);
				}
			}
		}
};
void menu(){
	cout << "1) Pokaz to menu" << endl;
	cout << "2) Biegnij" << endl;
	cout << "3) Koncz" << endl;
}

int main(){
	Pacjent * pac = new Pacjent();
	miernik* cis = new cisnieniomierz();
	miernik* cis2 = new cisnieniomierz2();
	pac->attach(cis);
	pac->attach(cis2);
	menu();
	int men = 0;
	while(men != 3){
		cin >> men;
		switch(men){
			case 1:
				menu();
				break;
			case 2:
				pac->ustaw();
				pac->notify();
				break;
			case 3:
				cout << "Koniec biegania na dzisiaj" << endl;
				break;
		}
	}
	delete cis2;
	delete cis;
	delete pac;

return 0;
}
Dodaj komentarz