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