
1 #ifndef OBSERVER_H
2 #define OBSERVER_H
3 #include<list>
4 #include<iostream>
5 using namespace std;
6
7 class Observer
8 {
9 public:
10 virtual void update()=0;
11 };
12
13 class Subject
14 {
15 public:
16 virtual void attach(Observer* observer)=0;
17 virtual void detach(Observer* observer)=0;
18 virtual void notify()=0;
19 };
20
21 class ConcreteSubject:public Subject
22 {
23 private:
24 list<Observer*> _observers;
25
26 int _state;
27
28 public:
29 ConcreteSubject():_state(0){
30 }
31
32 void attach(Observer* observer){
33 _observers.push_front(observer);
34 }
35
36 void detach(Observer* observer){
37 _observers.remove(observer);
38 }
39
40 void notify(){
41 list<Observer*>::iterator it;
42 for(it=_observers.begin();it!=_observers.end();++it){
43 (*it)->update();
44 }
45 }
46
47 int getState()const{
48 return _state;
49 }
50
51 void setState(int newState){
52 _state=newState;
53
54 notify();
55 }
56 };
57
58 class ConcreteObserverA:public Observer
59 {
60 private:
61 Subject* _subject;
62 public:
63 ConcreteObserverA(Subject* subject){
64 _subject=subject;
65 _subject->attach(this);
66 }
67
68 void update(){
69 ConcreteSubject* s=dynamic_cast<ConcreteSubject*>(_subject);
70 cout<<"ConcreteObserverA\n------"<<endl;
71 cout<<"update!\nThe new state is: "<<s->getState()<<endl<<endl;
72 }
73 };
74
75 class ConcreteObserverB:public Observer
76 {
77 private:
78 Subject* _subject;
79 public:
80 ConcreteObserverB(Subject* subject){
81 _subject=subject;
82 _subject->attach(this);
83 }
84
85 void update(){
86 ConcreteSubject* s=dynamic_cast<ConcreteSubject*>(_subject);
87 cout<<"ConcreteObserverB\n------"<<endl;
88 cout<<"update!\nThe new state is: "<<s->getState()<<endl<<endl;
89 }
90 };
91
92 class ConcreteObserverC:public Observer
93 {
94 private:
95 Subject* _subject;
96 public:
97 ConcreteObserverC(Subject* subject){
98 _subject=subject;
99 _subject->attach(this);
100 }
101
102 void update(){
103 ConcreteSubject* s=dynamic_cast<ConcreteSubject*>(_subject);
104 cout<<"ConcreteObserverC\n------"<<endl;
105 cout<<"update!\nThe new state is: "<<s->getState()<<endl<<endl;
106 }
107 };
108
109 #endif//OBSERVER_H
110
111 int main()
112 {
113 ConcreteSubject subject;
114 ConcreteObserverA observerA(&subject);
115 ConcreteObserverB observerB(&subject);
116 ConcreteObserverC observerC(&subject);
117
118 subject.notify();
119
120 subject.setState(100);
121
122
123
124 return 0;
125 }