zoukankan      html  css  js  c++  java
  • 观察者模式与Boost.Signals

     

    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需要编译才能使用。

  • 相关阅读:
    numpy-自定义ufunc函数和广播
    numpy-ufunc函数
    numpy数组(五)
    numpy数组(四)
    numpy数组(三)
    numpy数组(二)
    素数序列的生成及其应用(采用了新学的更高效的算法:布尔标记法 + 倍数淘汰法)
    demo04-js变量
    demo03-js注释
    demo02-js引入外链
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/4452056.html
Copyright © 2011-2022 走看看