多个主题对象,每个主题对象都有三个观察者,感觉有点问题,说不好。有问题请提出来。

 

[cpp] view plain copy
 
 print?
  1. /* 
  2.     观察者模式:定义一种一对多的依赖,让多个观察者同时观察一个对象,当对象状态发生变化时, 
  3.     会通知所有它的观察者 
  4. */  
  5.   
  6. #include <iostream>  
  7. #include <list>  
  8. #include <string>  
  9. using namespace std;  
  10.   
  11. class Subject;  
  12.   
  13. class Observer  
  14. {  
  15. protected:  
  16.     string name;  
  17.     Subject *subject;  
  18. public:  
  19.     Observer(Subject *subject, string name)  
  20.     {  
  21.         this->subject = subject;  
  22.         this->name = name;  
  23.     }  
  24.     virtual void Update()  
  25.     {}  
  26. };  
  27.   
  28. class Subject  
  29. {  
  30.     list<Observer*> observers;  
  31.   
  32. public:  
  33.   
  34.     void AddObserver(Observer *observer)  
  35.     {  
  36.         observers.push_back(observer);  
  37.     }  
  38.   
  39.     void RemoveObserver(Observer *observer)  
  40.     {  
  41.         observers.remove(observer);  
  42.     }  
  43.   
  44.     virtual void Notify()  
  45.     {  
  46.         list<Observer*>::iterator iter = observers.begin();  
  47.         for(; iter != observers.end(); iter++)  
  48.         {  
  49.             (*iter)->Update();  
  50.         }  
  51.     }  
  52.     virtual string  GetState()  
  53.     {  
  54.         return " ";  
  55.     }  
  56.   
  57.     int GetObserverSize()  
  58.     {  
  59.         return observers.size();  
  60.     }  
  61. };  
  62.   
  63. class ConcreteSubjectOne:public Subject  
  64. {  
  65.     string state;  
  66. public:  
  67.       
  68.     ConcreteSubjectOne(string state)  
  69.     {  
  70.         this->state ="One " + state;  
  71.     }  
  72.     string GetState()  
  73.     {  
  74.         return this->state;  
  75.     }  
  76. };  
  77.   
  78. class ConcreteSubjectTwo:public Subject  
  79. {  
  80.     string state;  
  81. public:  
  82.   
  83.     ConcreteSubjectTwo(string state)  
  84.     {  
  85.         this->state ="Two " + state;  
  86.     }  
  87.     string GetState()  
  88.     {  
  89.         return this->state;  
  90.     }  
  91. };  
  92.   
  93.   
  94. class ConcreteObserverOne:public Observer  
  95. {  
  96. public:  
  97.     ConcreteObserverOne(Subject *subject, string name)  
  98.         :Observer(subject, name)  
  99.     {  
  100.     }  
  101.     void Update()  
  102.     {  
  103.         cout<<"Observer Type One: "<< name << " subject state is "<< subject->GetState()<<endl;  
  104.     }  
  105.   
  106. };  
  107.   
  108. class ConcreteObserverTwo:public Observer  
  109. {  
  110. public:  
  111.     ConcreteObserverTwo(Subject *subject, string name)  
  112.         :Observer(subject, name)  
  113.     {  
  114.     }  
  115.     void Update()  
  116.     {  
  117.         cout<<"Observer Type Two: "<< name << " subject state is "<< subject->GetState()<<endl;  
  118.     }  
  119.   
  120. };  
  121.   
  122. int main()  
  123. {  
  124.     ConcreteSubjectOne *subject_1 = new ConcreteSubjectOne("subject__1");  
  125.     ConcreteSubjectTwo *subject_2 = new ConcreteSubjectTwo("subject__2");  
  126.   
  127.     ConcreteObserverOne *observer1  = new ConcreteObserverOne(subject_1, "observer 1");  
  128.     ConcreteObserverOne *observer2  = new ConcreteObserverOne(subject_1, "observer 2");  
  129.     ConcreteObserverOne *observer3  = new ConcreteObserverOne(subject_1, "observer 3");  
  130.   
  131.     ConcreteObserverTwo *observer4  = new ConcreteObserverTwo(subject_2, "observer 4");  
  132.     ConcreteObserverTwo *observer5  = new ConcreteObserverTwo(subject_2, "observer 5");  
  133.     ConcreteObserverTwo *observer6  = new ConcreteObserverTwo(subject_2, "observer 6");  
  134.   
  135.     subject_1->AddObserver(observer1);  
  136.     subject_1->AddObserver(observer2);  
  137.     subject_1->AddObserver(observer3);  
  138.   
  139.     subject_2->AddObserver(observer4);  
  140.     subject_2->AddObserver(observer5);  
  141.     subject_2->AddObserver(observer6);  
  142.   
  143.   
  144.     subject_1->Notify();  
  145.     subject_2->Notify();  
  146.   
  147.     cout<<subject_1->GetObserverSize()<<endl;  
  148.     cout<<subject_2->GetObserverSize()<<endl;  
  149.       
  150.     delete subject_1;  
  151.     delete subject_2;  
  152.   
  153.     delete observer6;  
  154.     delete observer5;  
  155.     delete observer4;  
  156.     delete observer3;  
  157.     delete observer2;  
  158.     delete observer1;  
  159.   
  160.     getchar();  
  161.     return 0;  
  162. }