从发布者和订阅者来看事件
来源:互联网 发布:bdu 大数据 编辑:程序博客网 时间:2024/04/30 02:28
写一个事件代码,只需要记住5个部分即可,如图所示:
1.声明委托:事件和事件处理程序必须有共同的签名和返回类型,它们通过委托类型进行描述。
2.声明事件:发布者类必须声明一个订阅者类可以注册的事件成员。
3.触发事件:发布者类中触发事件,便会调用注册在事件上的所有事件处理程序。
4.注册事件:订阅者必须订阅事件才能在事件被触发时得到通知。
5.处理事件:订阅者会在事件发生后执行相应的处理程序。
一、猫和老鼠的例子(不传递数据)
代码如下:
using System;namespace 练习专用{ //声明委托 public delegate void MyDel(); //发布者类-猫 class Cat { //声明事件 public event MyDel CatCryEvent; //在猫叫的方法中触发事件 public void Cry() { Console.WriteLine("有只猫在叫。。。"); //触发事件 CatCryEvent(); } } //订阅者类-老鼠 class Mouse { public Mouse(Cat cat) { //注册事件,订阅者老鼠向事件添加事件处理程序 cat.CatCryEvent += Run; } //处理事件,事件发生后的处理程序 void Run() { Console.WriteLine("老鼠快跑吧!!!"); } } class Program { static void Main(string[] args) { Cat cat1 = new Cat(); Mouse mouse1 = new Mouse(cat1); cat1.Cry(); } }}
二、猫和老鼠的例子(传递数据)
可以使用System命名空间提供的EventHandler委托类型,所以不需要自己定义委托类型了,它是这么定义的:
public delegate void EventHandler(object sender, EventArgs e);//第一个参数用来保存触发事件的对象的引用。由于是object类,所以可以匹配任何类型的实例//第二个参数用来保存状态信息,指明什么类型适用于该应用程序为了向事件处理程序的第二个参数传入数据,需要声明一个派生自EventArgs的自定义类来保存需要传入的数据。
代码如下:
using System;namespace 练习专用{ //自定义一个派生自EventArgs的类,保存数据 class CryEventArgs : EventArgs { //存储一个字符串 public string CatName { get; set; } } //发布者类-猫 class Cat { public string CatName { get; set; } //构造函数,给猫弄个名字 public Cat(string name) { this.CatName = name; } //声明事件,使用自定义类的泛型委托 public static event EventHandler<CryEventArgs> CatCryEvent; //在猫叫的方法中触发事件 public void Cry() { Console.WriteLine("有只猫在叫。。。"); //把猫的名字保存到刚才的自定义类中 CryEventArgs e = new CryEventArgs(); e.CatName = this.CatName; //触发事件,传递参数 CatCryEvent(this, e); } } //订阅者类-老鼠 class Mouse { public Mouse() { //注册事件,订阅者老鼠向事件添加事件处理程序 Cat.CatCryEvent += Run; } //处理事件,事件发生后的处理程序 void Run(object sender, CryEventArgs e) { if (e.CatName == "黑猫警长") { Console.WriteLine("是黑猫警长,老鼠快特么的跑吧!!!"); } else { Console.WriteLine("不是黑猫警长,是{0},老鼠不用跑了。。。", e.CatName); } } } class Program { static void Main(string[] args) { Cat cat1 = new Cat("黑猫警长"); Cat cat2 = new Cat("小猫咪"); Mouse mouse = new Mouse(); cat1.Cry(); Console.WriteLine("===============手动分割线==============="); cat2.Cry(); } }}
0 0
- 从发布者和订阅者来看事件
- (十一)ROS发布者和订阅者
- 发布者订阅者模式
- 发布者&订阅者模型
- C#事件发布者订阅者释放,强引用
- ROS学习之 cpp消息发布者和消息订阅者
- spring整合activeMQ-摘要(订阅者和发布者)
- Step into Redis- 07 - 发布者-订阅者
- 发布者订阅者模式(一)
- 简单的订阅者/发布者模式
- javascript 观察者模式 (订阅者与发布者)
- 简单的发布者/订阅者(Python)
- ZMQ(ZeroMQ)中订阅者和发布者模式的编写(PUB_SUB)
- ROS 编写一个简单的发布者和订阅者(C++)
- 一个订阅发布者模式
- 订阅/发布者模式---JavaScript
- dojo发布者订阅者(dojo/topic模块)
- Qt C++ Observer模式(发布者-订阅者)
- Oracle查询优化-01单表查询
- STL 优先队列 定义 优先级
- 数据结构预备知识
- windows文件与Linux文件互转
- php分页和数据表字段设计注意事项
- 从发布者和订阅者来看事件
- 马士兵javaSE小项目chat和Tank单机版总结
- Myeclipse如何使用Maven添加jar包
- 如何配置jdk
- memcached I/O模型源码分析
- hdoj 2089
- 如何在Eclipse下查看JDK源代码
- 为什么一个java源文件中只能有一个public类?
- 基本引用类型和对象引用类型区别