观察者模式(Observer Pattern)

  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 }
原文地址:https://www.cnblogs.com/freewater/p/2559204.html