Event 发布与订阅(一)
前言
主要讲的是发布与订阅在Event中的一个简单实现用来加深理解。
C #中的事件(Event)的理解:
事件具有以下属性:(From Events)
- 发行者确定何时引发事件;订户确定对事件作出何种响应。
 - 一个事件可以有多个订户。 订户可以处理来自多个发行者的多个事件。
 - 没有订户的事件永远也不会引发。
 - 事件通常用于表示用户操作,例如单击按钮或图形用户界面中的菜单选项。
 - 当事件具有多个订户时,引发该事件时会同步调用事件处理程序。 若要异步调用事件,请参阅 Calling Synchronous Methods Asynchronously。
 - 在 .NET Framework 类库中,事件基于 EventHandler 委托和 EventArgs 基类。
 
发布与订阅(Observer, Publish-Subscribe)
意图:
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并主动更新。解耦
别名: 依赖(Dependents),发布-订阅(Publish-Subscribe)
Observer模式描述了如何建立这种关系。这一模式中的关键对象是目标(Object)和观察者(observer)。一个目标可以有任意数目的依赖它的观察者。一旦目标的状态发生改变,所有的观察者都得到通知。作为对这个通知的响应,每个观察者都将查询目标以使其状态与目标的状态同步。
这种交互也称为 发布-订阅。目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者。可以有任意数目的观察者订阅并接收通知。
发布与订阅的实践
假设一个这样的场景。车类,以及乘客类
车类里:有一个事件,开车通知。有一个方法,开车。
调用开车方法时,通知订阅了开车通知的观察者,然后开车。
首先是定义一个车类:
using System;
namespace EventDemo {
    public class MyCar {
        //定义一个 上车 的委托
        public delegate void BeginOnCarHandler ();
        //定义一个 上车 委托方法的事件
        public event BeginOnCarHandler CarNotification;
        public string Name { get; set; }
        public void RunCar () {
            CarNotification ();
            Console.WriteLine ("好的,都上车了司机" + Name + ",开车了");
        }
    }
}
然后定义一个乘客类:
namespace EventDemo {
    public class Passenger {
        public string Name { get; set; }
        public void BeginToCar () {
            System.Console.WriteLine ("我上车了,我是:" + Name);
        }
    }
}
最后执行:
MyCar benz = new MyCar { Name = "Benz" };
            Passenger p4 = new Passenger { Name = "xiaoming" };
            Passenger p2 = new Passenger { Name = "xiaohong" };
            benz.CarNotification += new MyCar.BeginOnCarHandler(p2.BeginToCar);
            benz.CarNotification += new MyCar.BeginOnCarHandler(p4.BeginToCar);
            benz.RunCar ();
最后的结果为
上面的方法
benz.CarNotification += new MyCar.BeginOnCarHandler(p2.BeginToCar);
也可以改成
benz.CarNotification += p2.BeginToCar;
上面就是一个简单的发布/订阅的例子,在EventBus中也有其涉及的地方,正好可以了解记录一下。
今天下午又仔细思考了一下,更新了一下实例,如下:
一个车,是被观察者,也就是目标 object,它有一个事件,暂且叫它 发车事件。以及观察者 乘客类。
修改了一下Event代码:
using System;
namespace EventDemo {
    public class MyCar {
        //定义一个 上车 的委托
        public delegate void CarHandler (MyCar car);
        //定义一个 上车 委托方法的事件
        public event CarHandler CarNumberNotification;
        public string Name { get; set; }
        public int Count { get; set; }
        public void RunCar () {
            Console.WriteLine ($"好的,准备上车了,车名为:{Name},车上人数:{Count}");
            if (CarNumberNotification != null) {
                CarNumberNotification (this);
            }
            Console.WriteLine ($"The people now is:{Count}");
        }
    }
}
namespace EventDemo {
    public class Passenger {
        public string Name { get; set; }
        public void BeginToCar (MyCar car) {
            car.Count++;
            System.Console.WriteLine ($"我上车了,我是:{Name},我坐的车是{car.Name}");
        }
    }
}
            MyCar benz = new MyCar { Name = "Benz" };
            Passenger p1 = new Passenger { Name = "xiaoming" };
            Passenger p2 = new Passenger { Name = "xiaohong" };
            benz.CarNumberNotification += p1.BeginToCar;
            benz.CarNumberNotification += p2.BeginToCar;
            benz.RunCar ();
这样编写代码更加容易理解一些。
Event 发布与订阅(一)的更多相关文章
- Angular 个人深究(二)【发布与订阅】
		
Angular 个人深究(二)[发布与订阅] 1. 再入正题之前,首先说明下[ 发布与订阅模式](也叫观察者模式) 1) 定义:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个 ...
 - node.js 中 events emitter 的实现(发布、订阅模式)
		
const EventEmitter = require('events'); const myEmitter = new EventEmitter(); myEmitter.on('event', ...
 - (转)SqlServer 数据库同步的两种方式 (发布、订阅),主从数据库之间的同步
		
最近在琢磨主从数据库之间的同步,公司正好也需要,在园子里找了一下,看到这篇博文比较详细,比较简单,本人亲自按步骤来过,现在分享给大家. 在这里要提醒大家的是(为了更好的理解,以下是本人自己理解,如有错 ...
 - (原)3.2 Zookeeper应用 - 数据的发布与订阅
		
本文为原创文章,转载请注明出处,谢谢 数据的发布与订阅 1.应用 服务端监听数据改变,客户端创建/更新节点数据,客户端提供数据,服务端处理 2.原理 客户端监控节点数据改变事件(例如配置信息,下图的c ...
 - MSSQL复制中的发布与订阅
		
准备条件 1.2台服务器 2.WINDOWS SERVER 2008 64bit + 3.SQL SERVER 2008 R2 + 4.MSSQLSERVER服务与MSSQLAGENT服务正常运行中 ...
 - 知方可补不足~SQL2008中的发布与订阅模式
		
回到目录 作用:完成数据库与数据库的数据同步 原理:源数据库发布需要同时的表,存储过程,或者函数:目标数据库去订阅它,当源发生变化时,目标数据库自己同步,注意,由于这个过程是SQL自动完成的,所以要求 ...
 - RabbitMQ官方中文入门教程(PHP版) 第三部分:发布/订阅(Publish/Subscribe)
		
发布/订阅 在上篇教程中,我们搭建了一个工作队列.每个任务之分发给一个工作者(worker).在本篇教程中,我们要做的之前完全不一样——分发一个消息给多个消费者(consumers).这种模式被称为“ ...
 - 【SQL Sever】实现SQL Sever的发布。订阅。  双机热备
		
实现SQL Sever的发布和订阅 最大的好处就是: 可以实现读写分离,增删改操作在主数据库服务器上进行,查询在备份数据库服务器上进行.一方面提高软件执行效率,另一方面也减轻主库压力. 本次实现发布 ...
 - Redis - 发布和订阅
		
一.概述 1). 发布和订阅是一种消息通信模式. 2). 优点:使消息订阅者和消息发布者耦合度降低,类似设计模式中的观察者模式. 二.发布和订阅 订阅命令: // 订阅一个或多个频道 // 返回值:v ...
 
随机推荐
- rtmp发布录制视频
			
本文描述了rtmp发布本地视频的流程 一.简要介绍 RTMP协议规定,播放一个流媒体有两个前提步骤:第一步,建立一个网络连接(NetConnection):第二步,建立一个网络流(NetStream) ...
 - 如何在jenkins上新建一个项目及其简单配置
			
1.首先,点击[新建]进入选择页面,如下图(一般选择"构建一个自由风格的软件项目") 2.填好项目名称后,点击ok,跳转至如下页面,可以在这个页面进行项目的配置(包括拉源码 ...
 - alpha-咸鱼冲刺day1-紫仪
			
总汇链接 一,合照 emmmmm.自然是没有的. 二,项目燃尽图 三,项目进展 登陆界面随意写了一下.(明天用来做测试的) 把学姐给我的模板改成了自家的个人主页界面,侧边栏啥的都弄出来了(快撒花花 ...
 - The sum of numbers form 0 to n.(20.9.2017)
			
#include <stdio.h> int main() { int a,b,sum; printf("输入一个数字: "); scanf("%d" ...
 - Flask 视图
			
写个验证用户登录的装饰器:在调用函数前,先检查session里有没有用户 from functools import wraps from flask import session, abort de ...
 - Python 迭代器之列表解析
			
 [TOC] 尽管while和for循环能够执行大多数重复性任务, 但是由于序列的迭代需求如此常见和广泛, 以至于Python提供了额外的工具以使其更简单和高效. 迭代器在Python中是以C语言的 ...
 - signalR 消息推送
			
业务情景一:上传报表,上传excel.如果excel的数据量很大,上万条,上十万条数据,那么这个上传请求必然是个耗时请求.用户上传之后,很关心上传的进度和结果. 业务情景二:站内消息提醒,实时有效地接 ...
 - 再一次, 不要使用(include/require)_once
			
本文地址: http://www.laruence.com/2012/09/12/2765.html 最近关于apc.include_once_override的去留, 我们做了几次讨论, 这个APC ...
 - Pandas速查手册中文版
			
本文翻译自文章: Pandas Cheat Sheet - Python for Data Science ,同时添加了部分注解. 对于数据科学家,无论是数据分析还是数据挖掘来说,Pandas是一个非 ...
 - io使用的设计模式
			
File f = new File("c:/a.txt"); 1. FileInputStream fis = new FileInputStream(f); 2. Reader ...
 
			
		
