转载(四).Net Framework中的委托与事件

尽管 (委托、事件与Observer设计模式 )中的范例很好地完成了我们想要完成的工作,但是我们不仅疑惑:为什么.Net Framework 中的事件模型和上面的不同?为什么有很多的EventArgs参数?

在回答上面的问题之前,我们先搞懂 .Net Framework的编码规范:

l         委托类型的名称都应该以EventHandler结束。

l         委托的原型定义:有一个void返回值,并接受两个输入参数:一个Object 类型,一个 EventArgs类型(或继承自EventArgs)。

l         事件的命名为 委托去掉 EventHandler之后剩余的部分。

l         继承自EventArgs的类型应该以EventArgs结尾。

再做一下说明:

1.       委托声明原型中的Object类型的参数代表了Subject,也就是监视对象,在本例中是 Heater(热水器)。回调函数(比如Alarm的MakeAlert)可以通过它访问触发事件的对象(Heater)。

2.       EventArgs 对象包含了Observer所感兴趣的数据,在本例中是temperature。

上面这些其实不仅仅是为了编码规范而已,这样也使得程序有更大的灵活性。比如说,如果我们不光想获得热水器的温度,还想在Observer端(警报器或者显示器)方法中获得它的生产日期、型号、价格,那么委托和方法的声明都会变得很麻烦,而如果我们将热水器的引用传给警报器的方法,就可以在方法中直接访问热水器了。

现在我们改写之前的范例,让它符合 .Net Framework 的规范:

using System;

using System.Collections.Generic;

using System.Text;

namespace Delegate {

    // 热水器

    public class Heater {

        private int temperature;

        public string type = "RealFire 001";        // 添加型号作为演示

        public string area = "China Xian";          // 添加产地作为演示

        //声明委托

        public delegate void BoiledEventHandler(Object sender, BoliedEventArgs e);

        public event BoiledEventHandler Boiled;//声明事件

        // 定义BoliedEventArgs类,传递给Observer所感兴趣的信息

        public class BoliedEventArgs : EventArgs {

            public readonly int temperature;

            public BoliedEventArgs(int temperature) {

                this.temperature = temperature;

            }

        }

        // 可以供继承自 Heater 的类重写,以便继承类拒绝其他对象对它的监视

        protected virtual void OnBolied(BoliedEventArgs e) {

            if (Boiled != null) {   // 如果有对象注册

                Boiled(this, e);    // 调用所有注册对象的方法

            }

        }

        // 烧水。

        public void BoilWater() {

            for (int i = 0; i <= 100; i++) {

                temperature = i;

                if (temperature > 95) {

                    //建立BoliedEventArgs 对象。

                    BoliedEventArgs e = new BoliedEventArgs(temperature);

                    OnBolied(e);    // 调用 OnBolied方法

                }

            }

        }

    }

    // 警报器

    public class Alarm {

        public void MakeAlert(Object sender, Heater.BoliedEventArgs e) {

            Heater heater = (Heater)sender;     //这里是不是很熟悉呢?

            //访问 sender 中的公共字段

            Console.WriteLine("Alarm:{0} - {1}: ", heater.area, heater.type);

            Console.WriteLine("Alarm: 嘀嘀嘀,水已经 {0} 度了:", e.temperature);

            Console.WriteLine();

        }

    }

    // 显示器

    public class Display {

        public static void ShowMsg(Object sender, Heater.BoliedEventArgs e) {   //静态方法

            Heater heater = (Heater)sender;

            Console.WriteLine("Display:{0} - {1}: ", heater.area, heater.type);

            Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", e.temperature);

            Console.WriteLine();

        }

    }

    class Program {

        static void Main() {

            Heater heater = new Heater();

            Alarm alarm = new Alarm();

            heater.Boiled += alarm.MakeAlert;   //注册方法

            heater.Boiled += (new Alarm()).MakeAlert;       //给匿名对象注册方法

            heater.Boiled += new Heater.BoiledEventHandler(alarm.MakeAlert);    //也可以这么注册

            heater.Boiled += Display.ShowMsg;       //注册静态方法

            heater.BoilWater();//烧水,会自动调用注册过对象的方法

        }

    }

}

输出为:

Alarm:China Xian - RealFire 001:

Alarm: 嘀嘀嘀,水已经 96 度了:

Alarm:China Xian - RealFire 001:

Alarm: 嘀嘀嘀,水已经 96 度了:

Alarm:China Xian - RealFire 001:

Alarm: 嘀嘀嘀,水已经 96 度了:

Display:China Xian - RealFire 001:

Display:水快烧开了,当前温度:96度。

// 省略 ...

总结

    在本文中我首先通过一个GreetingPeople的小程序向大家介绍了委托的概念、委托用来做什么,随后又引出了事件,接着对委托与事件所产生的中间代码做了粗略的讲述。

    在第二个稍微复杂点的热水器的范例中,我向大家简要介绍了 Observer设计模式,并通过实现这个范例完成了该模式,随后讲述了.Net Framework中委托、事件的实现方式。




转自: http://hi.baidu.com/txh1204

转载于:https://www.cnblogs.com/runy/archive/2009/08/18/1548651.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496271.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

激光雷达:从光电技术角度看自动驾驶

来源&#xff1a; 传感器技术激光雷达和与之竞争的传感器技术&#xff08;相机、雷达和超声波&#xff09;加强了对传感器融合的需要&#xff0c;也对认真谨慎地选择光电探测器、光源和MEMS振镜提出了更高的要求。传感器技术、成像、雷达、光探测技术及测距技术&#xff08;激光…

Spring Data JPA 从入门到精通~定义查询方法的配置方法

定义查询方法的配置方法 由于 Spring JPA Repository 的实现原理是采用动态代理的机制&#xff0c;所以我们介绍两种定义查询方法&#xff0c;从方法名称中可以指定特定用于存储的查询和更新&#xff0c;或通过使用 Query 手动定义的查询&#xff0c;取决于实际对数据的操作&a…

socket的长连接、短连接、半包、粘包与分包

socket的半包&#xff0c;粘包与分包的问题和处理代码&#xff1a;http://blog.csdn.net/qq_16112417/article/details/50392463 知乎关于长连接和短连接&#xff1a;https://www.zhihu.com/search?typecontent&q长连接%20短连接 TCP网络通讯如何解决分包粘包问题&#…

在Windows2003server上安装msn9.0以上版本的解决办法

方法一&#xff1a; 最近windows 强制升级了msn 9的版本。导致我在windows2003下的msn又一次需要剥离出msi文件才能安装了。在网上逛了一圈发现了如下方法&#xff0c;这里分享下&#xff0c;同时&#xff0c;也感谢作者的详细步骤。 2003SERVER版安装MSN 9.0&#xff08;版本2…

oracle exec编译失效,编译oracle失效的函数、存储过程、视图等

进行oracle开发时常常为不时失效的存储过程&#xff0c;函数等苦恼&#xff0c;于是下决心解决这个问题&#xff0c;东查西找&#xff0c;找到一个好东东&#xff0c;在基础上又修改了一下,问题终于被我解决了。1。建立一个存储过程CREATE OR REPLACE PROCEDURE TIMER_AUTO_REC…

2018年中国人工智能行业研究报告|附下载

来源&#xff1a;网络大数据、艾瑞咨询广义人工智能指通过计算机实现人的头脑思维所产生的效果&#xff0c;是对能够从环境中获取感知并执行行动的智能体的描述和构建;相对狭义的人工智能包括人工智能产业(包含技术、算法、应用等多方面的价值体系)、人工智能技术(包括凡是使用…

浅谈基于TCP和UDP的协议设计

From&#xff1a;http://blog.sina.com.cn/s/blog_48d4cf2d0101859x.html 一个基于TCP/WebSockets的超级精简的长连接消息协议&#xff1a;https://studygolang.com/articles/10506 github 上 一个简单的消息协议&#xff1a;https://github.com/acrazing/stmp google prot…

Spring Data JPA 从入门到精通~方法的查询策略设置

方法的查询策略设置 通过下面的命令来配置方法的查询策略&#xff1a; EnableJpaRepositories(queryLookupStrategy QueryLookupStrategy.Key.CREATE_IF_NOT_FOUND) 其中&#xff0c;QueryLookupStrategy.Key 的值一共就三个&#xff1a; Create&#xff1a;直接根据方法名…

IE6下PNG图片透明效果(PNG图片做背景也可以)

懒人萱在这里保证发的文章都是高质量的经过测试的JS代码&#xff0c;而且IE6、IE7和火狐都兼容的&#xff0c;希望大家多多关注我的帖子&#xff0c;我会把我的经验都共享出来哦&#xff01;  懒人萱在寻找PNG图片透明效果的JS特效代码的时候&#xff0c;发现大部分的效果只能…

oracle数据块调用存储过程,VC调用存储过程的通用方法(ORACLE篇)

先对上一篇调用SQLServer的存储过程作一点补充&#xff0c;就是如果存储过程里有Insert,update,delete等操作&#xff0c;最后返回结果集&#xff0c;按示例代码有可能得不到数据&#xff0c;因为返回的数据有可能不在第一个结果集&#xff0c;需要进行遍历&#xff1a;long ln…

不用地图如何导航?DeepMind提出新型双路径强化学习「智能体」架构

来源&#xff1a;deepmind、arXiv作者&#xff1a;Piotr Mirowski、Matthew Koichi Grimes、Mateusz Malinowski、Karl Moritz Hermann、Keith Anderson、Denis Teplyashin、Karen Simonyan、Koray Kavukcuoglu、Andrew Zisserman、Raia Hadsell「雷克世界」编译&#xff1a;嗯…

C 和 C++ 宏 详解

From&#xff1a;https://www.cnblogs.com/njczy2010/p/5773061.html C中的预编译宏详解&#xff1a;http://www.cppblog.com/bellgrade/archive/2010/03/18/110030.html C语言的宏总结&#xff1a;http://blog.csdn.net/pirlck/article/details/51254590 C 语言中的 宏定义…

常用代码生成工具介绍

1&#xff1a;CodeSmith工具优点&#xff1a;支持模板类&#xff0c;可扩展强。建议使用。目前公认的最强大的代码生成工具&#xff0c;支持各种语言。可以和开发环境无缝集成。例如&#xff1a;Vs2008等。缺点&#xff1a;不免费&#xff0c;最新的可破解版本为4.0.2&#xff…

Spring Data JPA 从入门到精通~查询方法的创建

查询方法的创建 内部基础架构中有个根据方法名的查询生成器机制&#xff0c;对于在存储库的实体上构建约束查询很有用&#xff0c;该机制方法的前缀 find…By、read…By、query…By、count…By 和 get…By 从所述方法和开始分析它的其余部分&#xff08;实体里面的字段&#x…

oracle表参数,Oracle 表的创建 及相关参数

1、创建表完整语法CREATE TABLE [schema.]table(column datatype [, column datatype] … )[TABLESPACE tablespace][PCTFREE integer][PCTUSED integer][INITRANS integer][MAXTRANS integer][STORAGE storage-clause][LOGGING | NOLOGGING][CACHE | NOCACHE] ];说明&#xff…

人工智能在能源行业的5个应用

作者&#xff1a;CB Insights . 来源&#xff1a;CometLabs摘要&#xff1a;自2012年以来&#xff0c;把人工智能和能源产业放在一起进行报道的新闻开始增多。本文简要描述了人工智能在能源行业的5个应用方向&#xff0c;及对应的案例。能源行业会产生大量的数据。为了将这些数…

fork vfork exit _exit (转)

原文地址&#xff1a;http://hi.baidu.com/ikaruga11/blog/item/fb6d75725a8d8d148701b080.htmlAPUE上的一个例子&#xff1a;example1 (forkt.c ):#include<stdlib.h>#include<unistd.h>#include<stdio.h>#include<sys/types.h>int glob 5;int main(…

VMware 安装 win7、win10、MAC 和网络模式VMnet0、VMnet1、VMnet8解释

VMware虚拟机安装ghost win7系统方法&#xff1a;http://www.xitongcheng.com/jiaocheng/xtazjc_article_15314.html VMWare14 安装Mac OS系统&#xff08;图解&#xff09;&#xff1a;http://blog.csdn.net/u011415782/article/details/78505422 虚拟机&#xff08;VMware …

Spring Data JPA 从入门到精通~关键字列表

注意除了 find 的前缀之外&#xff0c;我们查看 PartTree 的源码&#xff0c;还有如下几种前缀&#xff1a; private static final String QUERY_PATTERN "find|read|get|query|stream"; private static final String COUNT_PATTERN "count"; private s…

当科学遇上众包:9个值得关注的前沿科技算力众包平台

来源&#xff1a; 资本实验室 . 作者&#xff1a;李鑫找到癌症治疗的方法&#xff0c;预测气候的变化&#xff0c;追踪可能与地球相撞的小行星……甚至预测地震&#xff0c;我们每天都面临着各种世界性难题。如果你想参与解决这些难题&#xff0c;公民科学应用将让你发挥作用…