码迷,mamicode.com
首页 > 其他好文 > 详细

观察者模式与Boost.Signals

时间:2015-04-23 23:10:45      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:

 

1)  观察者模式定义

略,各种设计模式的书上都有定义。

 

2)  观察者模式一般实现

观察者模式一般实现,都是“被观察者”保存一个“观察者”的列表,循环这个列表来通知“观察者”。代码,其中使用了boost的智能指针shared_ptr:

 

[cpp] view plaincopy
 
  1. #include <iostream>  
  2. #include <list>  
  3. #include "boost/shared_ptr.hpp"  
  4. using namespace std;  
  5. using namespace boost;  
  6.   
  7. //观察者基类  
  8. class Observer  
  9. {  
  10. public:  
  11.     //处理被观察者的通知  
  12.     virtual void update(const int i) = 0;  
  13. };  
  14.   
  15. //观察者类A  
  16. class ObserverA : public Observer  
  17. {  
  18. public:  
  19.     virtual void update(const int i)  
  20.     {  
  21.         cout << "ObserverA.update(" << i << ")" << endl;  
  22.     }  
  23. };  
  24.   
  25. //观察者类B  
  26. class ObserverB : public Observer  
  27. {  
  28. public:  
  29.     virtual void update(const int i)  
  30.     {  
  31.         cout << "ObserverB.update(" << i << ")" << endl;  
  32.     }  
  33. };  
  34.   
  35. //被观察者基类  
  36. class Subject  
  37. {  
  38. public:  
  39.     virtual ~Subject()  
  40.     {  
  41.   
  42.     }  
  43.     //注册观察者  
  44.     virtual void reg(const shared_ptr<Observer>& pObs) = 0;  
  45.     //取消注册观察者  
  46.     virtual void unreg(const shared_ptr<Observer>& pObs) = 0;  
  47.     //通知观察者  
  48.     virtual void notify(const int i) = 0;  
  49. };  
  50.   
  51. //被观察者类A  
  52. class SubjectA : public Subject  
  53. {  
  54. public:  
  55.     virtual void reg(const shared_ptr<Observer>& pObs)  
  56.     {  
  57.         m_lstObs.push_back(pObs);  
  58.     }  
  59.     virtual void unreg(const shared_ptr<Observer>& pObs)  
  60.     {  
  61.         for (list<shared_ptr<Observer> >::iterator it = m_lstObs.begin();  
  62.             it != m_lstObs.end();)  
  63.         {  
  64.             if (pObs == *it) m_lstObs.erase(it++);  
  65.             else ++it;  
  66.         }  
  67.     }  
  68.     virtual void notify(const int i)  
  69.     {  
  70.         for (list<shared_ptr<Observer> >::iterator it = m_lstObs.begin();  
  71.             it != m_lstObs.end(); ++it)  
  72.         {  
  73.             (*it)->update(i);  
  74.         }  
  75.     }  
  76. protected:  
  77.     //观察者类别  
  78.     list<shared_ptr<Observer> > m_lstObs;  
  79. };  
  80.   
  81. int main()  
  82. {  
  83.     //被观察者pSubA  
  84.     shared_ptr<Subject> pSubA(new SubjectA);  
  85.     //观察者pObsA  
  86.     shared_ptr<Observer> pObsA(new ObserverA);  
  87.     //观察者pObsB  
  88.     shared_ptr<Observer> pObsB(new ObserverB);  
  89.     //注册pObsA  
  90.     pSubA->reg(pObsA);  
  91.     //注册pObsB  
  92.     pSubA->reg(pObsB);  
  93.     //通知  
  94.     pSubA->notify(1);                //显示  
  95.                                     //ObserverA.update(1)  
  96.                                     //ObserverB.update(1)  
  97.     //取消pObsA的注册  
  98.     pSubA->unreg(pObsA);  
  99.     //通知  
  100.     pSubA->notify(2);                //显示  
  101.                                     //ObserverB.update(2)  
  102.     return 0;  
  103. }  

 

 

3)  观察者模式Boost.Signals实现

Boost.Signals是基于函数指针或函数对象来实现观察者模式的。其中Boost.Signals2是线程安全版本。代码:

 

[cpp] view plaincopy
 
  1. #include <iostream>  
  2. #include <list>  
  3. #include "boost/shared_ptr.hpp"  
  4. #include "boost/signal.hpp"  
  5. using namespace std;  
  6. using namespace boost;  
  7.   
  8. //使用函数对象来实现  
  9. //观察者类A  
  10. class ObserverA  
  11. {  
  12. public:  
  13.     void operator()(const int i)  
  14.     {  
  15.         cout << "ObserverA(" << i << ")" << endl;  
  16.     }  
  17. };  
  18.   
  19. //观察者类B  
  20. class ObserverB  
  21. {  
  22. public:  
  23.     void operator()(const int i)  
  24.     {  
  25.         cout << "ObserverB(" << i << ")" << endl;  
  26.     }  
  27. };  
  28.   
  29. int main()  
  30. {  
  31.     //被观察者sig  
  32.     signal<void (const int)> sig;  
  33.     //注册观察者ObserverA  
  34.     signals::connection connA = sig.connect(ObserverA());  
  35.     //注册观察者ObserverB  
  36.     sig.connect(ObserverB());  
  37.   
  38.     //通知  
  39.     sig(1);                 //显示  
  40.                             //ObserverA(1)  
  41.                             //ObserverB(1)  
  42.     //取消obsA的注册  
  43.     connA.disconnect();  
  44.     //通知  
  45.     sig(2);                 //显示  
  46.                             //ObserverB(2)  
  47.     return 0;  
  48. }  

 

Boost.Signals还支持被观察者分组,可以对整个组进行“通知”、取消注册。另外,Boost.Signals需要编译才能使用。

观察者模式与Boost.Signals

标签:

原文地址:http://www.cnblogs.com/lvdongjie/p/4452056.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!