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

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

原文地址:https://www.cnblogs.com/lulu1997/p/8492072.html

时间: 2024-10-18 22:54:34

设计模式(二)观察者监听者模式的相关文章

天天设计模式二:创建型模式实践

天天设计模式二:创建型模式实践 创建型设计模式主要应用在对象创建,以不同的方式来满足系统的灵活性配置.动态注入.等应用场景. 一.单例模式 二.抽象工厂 三.建造者模式 四.工厂方法模式 五.原型模式

监听者模式

监听者模式是观察者模式实现的一种,也属于Publish/Subscribe模式,被监听者触发某一事件后向监听者发送通知.在java中最常用的就是在编写GUI程序时,控件的事件监听了. 通常在编写java的GUI程序时,需要在控件上注册一个监听器,这个监听器需要开发人员自己编写,当控件被监听的事件触发后,监听器也会做出响应的反应. Frame frame = new Frame("java"); frame.setBounds(400, 300, 300, 200); frame.set

[设计模式]Netd中的命令设计模式,NetworkManagementService中的监听者模式

命令模式中有如下的角色: (1)调用者(invoker) (2)命令接收者(receiver) (3)客户端(client) (4)命令对象(command) 1 public interface Command { 2 public void execute(); 3 } 4 public class ConcreteCommand implements Command { 5 6 private Receiver receiver = null; 7 private String state

设计模式之监听者模式

package listenermode; public class Button { //在类中定义接口对象 ,都是button的行为 public interface OnClickListener { public void onClickListener (); } private OnClickListener listener =null; public void setOnClickListener(OnClickListener cbl){ this.listener = cbl

设计模式之监听模式(观察者模式与监听模式区别)

一,类的四大基本关系:  a.关联关系:如A类调用B类. b.继承关系:如A类是B类的父类. c.聚合关系:如装橘子的箱子,箱子是否存在与里面装没装橘子没有任何关系,也就是说橘子不会影响箱子的存在. d.组合关系:如一个小组,小组是否存在与小组中是否有组员是息息相关的,如果没有组员,小组就不存在了. 监听器模式:事件源经过事件的封装传给监听器,当事件源触发事件后,监听器接收到事件对象可以回调事件的方法 观察者模式:观察者(Observer)相当于事件监听者,被观察者(Observable)相当于

KVO监听者

监听者模式方便的监听所需要的值得变化 @implementation ViewController - (IBAction)Buton:(id)sender { self.view.backgroundColor=[UIColor redColor]; } - (void)viewDidLoad { [super viewDidLoad]; self.model=[[Model alloc]init]; //第一个参数是 被监听者 //第二个参数是  监听者 //第三个参数是  监听内容 //第

设计模式(二)---工厂方法模式

设计模式(二)---工厂方法模式 工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品. 抽象工厂源代码 public interface Creator { /** * 工厂方法 */ public Product factory(); } 抽象产品

设计模式(二) 模式语录

设计模式--模式语录 <Design Patterns:Elements of Reusable Object-Oriented Software>尽管是英文描述的,了解和喜欢设计模式的同仁看到这个书目,熟悉得犹如看到下面这张图: 当你发现这不是一张完整的图的时候,不要以为被我忽悠了,即便你是被我善意地小小忽悠了一下,但你忽悠不了你自己(GOF的设计模式),很快其他部分自然而然的在你脑海里呈现出来.如果说你还没有打算现在或者将来去学习和使用设计模式来改善自己的编码和设计,请你不要觉得我在故弄玄

设计模式系列二(策略者模式)

浑浑噩噩的过的漫无目的,更多的是迷茫,真不知该如何定位自己的人生?空有远大抱负,而又力不从心!有句话说的好,当你的才能撑不起你的野心的时候,就该静下来心来好好学习了!于是闲来无事,便继续开始我的设计模式之游!今天便研究下策略者模式! 1.策略者模式解析 大话设计模式是这样讲道: 策略者模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法减少各种算法类与使用算法类之间的耦合[DPE]. 个人理解:所谓一系列算法方法就是一系列