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 }