• 设计模式(二)观察者监听者模式


    基于MAP线程安全的观察者监听者模式

      1 #include<map>  
      2 #include<string>  
      3 #include<vector>  
      4 #include<iostream>  
      5 #include<memory>  
      6 using namespace std;  
      7   
      8 class Listener  
      9 {  
     10 public:  
     11     Listener(string name):_name(name){}  
     12     virtual void handleMessage(int msgid) = 0;  
     13     string _name;  
     14 };  
     15   
     16 class Listener1 : public Listener  
     17 {  
     18 public:  
     19     Listener1(string name):Listener(name){}  
     20     void handleMessage(int msgid)  
     21     {  
     22         cout<<_name<<" ";  
     23         switch(msgid)  
     24         {  
     25         case 0:  
     26             cout<<"handle 0 msg!"<<endl;  
     27             break;  
     28         case 1:  
     29             cout<<"handle 1 msg!"<<endl;  
     30             break;  
     31         default:  
     32             cout<<"recv invalid msg!"<<endl;  
     33             break;  
     34         }  
     35     }  
     36 };  
     37   
     38 class Listener2 : public Listener  
     39 {  
     40 public:  
     41     Listener2(string name):Listener(name){}  
     42     void handleMessage(int msgid)  
     43     {  
     44         cout<<_name<<" ";  
     45         switch(msgid)  
     46         {  
     47         case 0:  
     48             cout<<"handle 0 msg!"<<endl;  
     49             break;  
     50         case 2:  
     51             cout<<"handle 2 msg!"<<endl;  
     52             break;  
     53         default:  
     54             cout<<"recv invalid msg!"<<endl;  
     55             break;  
     56         }  
     57     }  
     58 };  
     59   
     60 class Listener3 : public Listener  
     61 {  
     62 public:  
     63     Listener3(string name):Listener(name){}  
     64     void handleMessage(int msgid)  
     65     {  
     66         cout<<_name<<" ";  
     67         switch(msgid)  
     68         {  
     69         case 1:  
     70             cout<<"handle 1 msg!"<<endl;  
     71             break;  
     72         case 3:  
     73             cout<<"handle 3 msg!"<<endl;  
     74             break;  
     75         default:  
     76             cout<<"recv invalid msg!"<<endl;  
     77             break;  
     78         }  
     79     }  
     80 };  
     81   
     82 class Observer  
     83 {  
     84 public:  
     85     void registerMsg(weak_ptr<Listener> plistener,int msgid)  
     86     {  
     87         map<int,vector<weak_ptr<Listener>>>::iterator it = _obserMap.find(msgid);  
     88         if(it == _obserMap.end())  
     89         {  
     90             vector<weak_ptr<Listener>> vec;  
     91             vec.push_back(plistener);  
     92             _obserMap.insert (make_pair(msgid,vec));  
     93         }  
     94         else  
     95         {  
     96             it->second.push_back(plistener);   
     97         }  
     98     }  
     99   
    100    void dispatchMsg(int msgid)  
    101     {  
    102         map<int,vector<weak_ptr<Listener>>>::iterator it = _obserMap.find(msgid);  
    103         if(it!=_obserMap.end())  
    104         {  
    105             vector<weak_ptr<Listener>>::iterator vit = it->second.begin();  
    106             for(;vit!=it->second.end();++vit)  
    107             {  
    108                 //(*vit)->handleMessage(msgid);  
    109                 shared_ptr<Listener> p = (*vit).lock();//提升  
    110                 if(p != NULL)  
    111                 {  
    112                     p->handleMessage(msgid);  
    113                 }  
    114             }  
    115         }  
    116     }  
    117 private:  
    118     map<int,vector<weak_ptr<Listener>>> _obserMap;  
    119 };  
    120   
    121 Observer obser;  
    122 int main()  
    123 {  
    124     //监听者线程  
    125     shared_ptr<Listener> p1(new Listener1("Listener1"));  
    126     shared_ptr<Listener> p2(new Listener2("Listener2"));  
    127     shared_ptr<Listener> p3(new Listener3("Listener3"));  
    128   
    129     //Observer obser;   
    130   
    131     obser.registerMsg(p1,0);  
    132     obser.registerMsg(p1,1);  
    133     obser.registerMsg(p2,0);  
    134     obser.registerMsg(p2,2);  
    135     obser.registerMsg(p3,1);  
    136     obser.registerMsg(p3,3);  
    137   
    138     //观察者线程  
    139     int msgid = 0;  
    140     while(true)  
    141     {  
    142         cout<<"msgid :";  
    143         cin>>msgid;  
    144   
    145         obser.dispatchMsg(msgid);  
    146     }  
    147     return 0;  
    148 }  
  • 相关阅读:
    shell脚本学习001
    Discuz 代码分析 001 forum.php
    Oauth2.0 入门
    第一篇文章
    position的四个属性值: relative ,absolute ,fixed,static
    JQuery中stop([clearQueue],[goToEnd])介绍
    <meta>
    sublime 2中Package control安装和使用
    ios 状态码
    <video>和<audio>标签,对视频和音频的支持
  • 原文地址:https://www.cnblogs.com/lulu1997/p/8492072.html
Copyright © 2020-2023  润新知