《观察者模式》

来源:互联网 发布:华为 精品推荐 淘宝客 编辑:程序博客网 时间:2024/05/16 03:49

观察者模式应该说比较简单,就是将不同观察者注册到被观察者内部,被观察者做了什么动作,都会通知到观察者。。。

 

代码中,被观察者也可以形成接口,有不同的子类,被观察,更灵活一些。。。

 

下面代码

 

[cpp] view plaincopy
  1. // Observer.cpp : 定义控制台应用程序的入口点。  
  2. //************************************************************************/      
  3. /* @filename    Observer.cpp 
  4. @author       wallwind   
  5. @createtime    2012/11/2 23:58 
  6. @function     观察者模式 
  7. @email       wochenglin@qq.com   
  8. @weibo      @成林有理想 
  9. */      
  10. /************************************************************************/  
  11.   
  12. #include "stdafx.h"  
  13. #include <iostream>  
  14. #include <vector>  
  15.   
  16. using namespace std;  
  17. /* 
  18.     观察者 
  19. */  
  20. class IObserver  
  21. {  
  22. public:  
  23.     IObserver(){}  
  24.     virtual ~IObserver(){}  
  25.     virtual void update() = 0;  
  26. };  
  27.   
  28. /* 
  29.     观察者1; 
  30. */  
  31.   
  32. class FirstObserver :public IObserver  
  33. {  
  34. public:  
  35.     FirstObserver(){}  
  36.     virtual ~FirstObserver(){}  
  37.   
  38.     virtual void update()  
  39.     {  
  40.         cout<<"FirstObserver KNOW  OBSERVERABLE DO ACTION" <<endl;  
  41.           
  42.     }  
  43. };  
  44.   
  45. class SecondObserver :public IObserver  
  46. {  
  47. public:  
  48.     SecondObserver(){}  
  49.     virtual ~SecondObserver(){}  
  50.   
  51.     virtual void update()  
  52.     {  
  53.         cout<<"SecondObserver KNOW  OBSERVERABLE DO ACTION" <<endl;  
  54.     }  
  55.   
  56. };  
  57. /** 
  58. 被观察者 
  59. */  
  60. class Observable  
  61. {  
  62. public:  
  63.     Observable()  
  64.     {  
  65.           
  66.     }  
  67.     ~Observable()  
  68.     {  
  69.           
  70.     }  
  71.   
  72.     void addObser(IObserver* obser)  
  73.     {  
  74.         m_obserSet.push_back(obser);  
  75.     }  
  76.   
  77.     void removeObser(IObserver* obser)  
  78.     {  
  79.         m_obserSet.pop_back();  
  80.     }  
  81.   
  82.   
  83.     void doAction()  
  84.     {  
  85.         cout<<"Observable do some action " <<endl;  
  86.   
  87.         this->notifyAllObser();  
  88.     }  
  89.       
  90.     void notifyAllObser()  
  91.     {  
  92.         vector< IObserver* > ::iterator iter = m_obserSet.begin();  
  93.         for (;iter !=m_obserSet.end();iter++)  
  94.         {  
  95.             (*iter)->update();  
  96.         }  
  97.     }  
  98.   
  99.   
  100. private:  
  101.     vector< IObserver* > m_obserSet;  
  102. };  
  103.   
  104.   
  105. int _tmain(int argc, _TCHAR* argv[])  
  106. {  
  107.   
  108.     IObserver * fober = new FirstObserver();  
  109.     IObserver * sober = new SecondObserver();  
  110.   
  111.     Observable * oble = new Observable;  
  112.     oble->addObser(fober);  
  113.     oble->addObser(sober);  
  114.   
  115.     oble->doAction();  
  116.   
  117.     return 0;  
  118. }  
原创粉丝点击