Advertisement
Guest User

obserwator

a guest
Mar 27th, 2017
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.72 KB | None | 0 0
  1. #include <iostream>
  2. #include <list>
  3. #include <algorithm>
  4. #include <string>
  5. #include<fstream>
  6.  
  7. using namespace std;
  8.  
  9. struct STATE{
  10. string nazwa;
  11. string tekst;
  12. };
  13.  
  14. class Observer;
  15.  
  16. class Subject
  17. {
  18. public:
  19. Subject() {
  20. m_nSubjectState.nazwa="";
  21. m_nSubjectState.tekst="";
  22. }
  23. virtual ~Subject();
  24.  
  25. void Notify();
  26. void Attach(Observer* pOberver);
  27. void Detach(Observer* pOberver);
  28.  
  29. virtual void SetState(STATE nState);
  30. virtual STATE GetState();
  31.  
  32. protected:
  33. STATE m_nSubjectState;
  34. std::list<Observer*> m_ListObserver;
  35. };
  36.  
  37. class Observer
  38. {
  39. public:
  40. Observer(){
  41. m_nObserverState.nazwa="";
  42. m_nObserverState.tekst="";
  43. }
  44.  
  45.  
  46. virtual ~Observer() {}
  47. virtual void Update(Subject* pSubject) = 0;
  48.  
  49. protected:
  50. STATE m_nObserverState;
  51.  
  52.  
  53. };
  54.  
  55. class ConcreateSubject : public Subject
  56. {
  57. public:
  58. ConcreateSubject() : Subject() {}
  59. virtual ~ConcreateSubject() {}
  60.  
  61. virtual void SetState(STATE nState);
  62. virtual STATE GetState();
  63. void Update(Subject* pSubject);
  64. };
  65.  
  66. class ConcreateObserver : public Observer
  67. {
  68. private:
  69. string login;
  70. fstream plik;
  71. public:
  72. ConcreateObserver(string naz) : Observer() {
  73. login=naz;
  74. plik.open(naz+".txt",std::ios::out );
  75.  
  76.  
  77. }
  78.  
  79.  
  80. virtual ~ConcreateObserver() {
  81. }
  82. virtual void Update(Subject* pSubject);
  83. };
  84.  
  85.  
  86.  
  87. void Subject::Attach(Observer* pObserver)
  88. {
  89. std::cout << "Attach an Observer\n";
  90. m_ListObserver.push_back(pObserver);
  91. }
  92.  
  93. void Subject::Detach(Observer* pOberver)
  94. {
  95. std::list<Observer*>::iterator iter;
  96. iter = std::find(m_ListObserver.begin(),m_ListObserver.end(),pOberver);
  97. if (m_ListObserver.end() != iter)
  98. {
  99. m_ListObserver.erase(iter);
  100. }
  101. std::cout << "Detach an Observer\n";
  102. }
  103.  
  104. void Subject::Notify()
  105. {
  106. std::cout << "Notify Observer's State\n";
  107. std::list<Observer*>::iterator iter1,iter2;
  108. iter1 = m_ListObserver.begin();
  109. iter2 = m_ListObserver.end();
  110. for (;iter1 != iter2; ++iter1)
  111. {
  112. (*iter1)->Update(this);
  113. }
  114. }
  115.  
  116. void Subject::SetState(STATE nState)
  117. {
  118. std::cout << "SetState By Subject\n";
  119. m_nSubjectState = nState;
  120. }
  121.  
  122. STATE Subject::GetState()
  123. {
  124. std::cout << "GetState By Subject\n";
  125. return m_nSubjectState;
  126. }
  127.  
  128. Subject::~Subject()
  129. {
  130. std::list<Observer*>::iterator iter1,iter2,temp;
  131. iter1 = m_ListObserver.begin();
  132. iter2 = m_ListObserver.end();
  133. for (;iter1 != iter2;)
  134. {
  135. temp = iter1;
  136. ++iter1;
  137. delete(*temp);
  138. }
  139. m_ListObserver.clear();
  140. }
  141.  
  142. void ConcreateSubject::SetState(STATE nState)
  143. {
  144. std::cout << "SetState By ConcreateSubject\n";
  145. m_nSubjectState = nState;
  146. }
  147.  
  148. STATE ConcreateSubject::GetState()
  149. {
  150. std::cout << "GetState By ConcreateSubject\n";
  151. return m_nSubjectState;
  152. }
  153.  
  154. void ConcreateObserver::Update(Subject* pSubject)
  155. {
  156. if (NULL == pSubject)
  157. {
  158. return;
  159. }
  160. m_nObserverState = pSubject->GetState();
  161. plik<<"Wiadomość:"+m_nObserverState.tekst+" - wysłana przez:"<<m_nObserverState.nazwa<<endl;
  162.  
  163. // std::cout << "The ObserverState is " << m_nObserverState << std::endl;
  164. }
  165.  
  166. int main()
  167. {
  168. Observer *p1 = new ConcreateObserver("Mietek");
  169. Observer *p2 = new ConcreateObserver("Grzesiek");
  170. Observer *p3 = new ConcreateObserver("Szczepan");
  171. // Observer *p2 = new ConcreateObserver;
  172. Subject* p = new ConcreateSubject;
  173.  
  174. STATE st;
  175. st.nazwa="ktos";
  176. st.tekst="cos";
  177. STATE st1;
  178. st.nazwa="ktos2";
  179. st.tekst="cos2";
  180.  
  181. p->Attach(p1);
  182. p->SetState(st);
  183. p->Notify();
  184.  
  185. p->Notify();
  186.  
  187.  
  188.  
  189. /*
  190. p->Attach(p2);
  191. p->SetState(st1);
  192. p->Notify();
  193.  
  194. p->Detach(p1);
  195. p->Attach(p3);
  196. p->SetState(st);
  197. p->Notify();
  198. */
  199.  
  200. /*
  201. p->Attach(p1);
  202. p->Attach(p2);
  203. p->SetState(4);
  204. p->Notify();
  205. p->Detach(p1);
  206. p->SetState(10);
  207. p->Notify();
  208. delete p;
  209. */
  210.  
  211. return 0;
  212. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement