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;
}

