设计模式观察者监听者模式

Posted ll_1997_ll

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式观察者监听者模式相关的知识,希望对你有一定的参考价值。

基于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 }  

 

以上是关于设计模式观察者监听者模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式观察者模式

java规则引擎规则引擎RuleBase中利用观察者模式

guava eventbus代码分析

Spring 事件发布

Spring 事件发布

KVO-理解与简单使用