第二十章、分离应用程序逻辑并处理事件

  理解委托

  委托是对方法的引用。(之所以称为委托,是因为一旦被调用,就将具体的处理“委托”给引用的方法)

  委托对象引用了方法,和将int赋值给int变量一样,是将方法引用赋给委托对象。

  Processor p = new Processor ();

  delegate...performCalculationDelegate...;

  performCalculationDelegate = p.performCalculation;//将方法引用赋给委托对象

  将方法引用赋给委托时,并不是马上就运行方法。方法名之后没有圆括号,也不指定任何参数。这纯粹就是一个赋值语句。

  将对Processor 对象的performCalculation方法的引用存储到委托中之后,应用程序就可通过委托来调用方法了,如下:

  performCalculationDelegate ();  //通过委托来调用方法

  另外,委托可一次引用多个方法(把它想象成方法引用集合)。一旦调用委托,所有方法都会运行。

  尚未引用有效方法的委托是不能调用的。

  谓词其实就是委托。只不过它恰好返回Boolean值而已。

  声明委托

  delegate void stopMachineryDelegate();

  注意一下几点:

  1、声明委托要使用delegate关键字。

  2、委托定义了它所引用的方法的“形式”。要指定返回类型(本例是void)、委托名称(stopMachineryDelegate)以及任何参数(本例无参数);

  定义好委托之后,就可创建它的实例,并用+=操作符让该实例引用匹配的方法。

  class Controller

  {

  delegate void stopMachineryDelegate(); //声明委托类型

  private stopMachineryDelegate stopMachinery; //创建委托实例

  ......

  public Controller()

  {

  this. stopMachinery += folder.StopFolding;

  }

  ........

  }

  上述语法只是将方法加到委托中;此时并没有实际调用方法。注意,只需指定方法名,不要包含任何圆括号或者参数。

  可安全地将+=操作符用于未初始化的委托。该委托将自动初始化。还可以使用new关键字显示初始化委托。让它引用一个特定的方法。

  this.StopMachinery = new stopMachineryDelegate(folder.StopFolding);

  可通过调用委托来调用它引用的方法,如下:

  public void ShutDown()

  {

  this. stopMachinery ();  //通过调用委托来调用它引用的方法

  }

  委托的主要优势在于它能引用多个方法;使用+=操作符把这些方法添加到委托中即可。就像这样:

  public Controller()

  {

  this. stopMachinery += folder.StopFolding;

  this. stopMachinery += welder.FinishWelding;

  this. stopMachinery += painter.PaintOff;

  }

  在Controller类的Shutdown方法中调用this. stopMachinery (),将自动依次调用上述每一个方法。

  使用-=复合赋值操作符,则可从委托中移除一个方法。

  如果方法与委托签名不匹配,假设StopFolding方法的签名实际是void StopFolding(int shutDownTime);

  1、创建方法适配器

  void FinishFolding()

  {

  folder. StopFolding(0);

  }

  2、Lambda表达式

  this.stopMachinery +=(() => folder. StopFolding(0));

  .NET Framework提供类事件。可定义并捕捉特定的事件,并在发生特定事件时调用委托来处理事件。

  声明事件

  事件在准备作为事件来源的类中声明。事件来源类监视其环境,在发生某件事情时引发事件。事件维护着方法列表,引发事件将调用这些方法。有时将这些方法称为订阅者。

  声明事件的方式与字段很相似。但由于事件随同委托使用,所有事件的类型必须是委托,而且必须在声明前附加event前缀。用以下语法声明事件:

  event delegateTypeName eventName //delegateTypeName是委托类型名称 eventName是事件名称

  如下:定义MachineOverheating事件,该事件将调用StopMachineryDelegate

  class TemperatureMonitor{

  public delegate void StopMachineryDelegate();

  public event StopMachineryDelegate MachineOverheating; //声明事件

  ..........

  }

  另外,要把方法添加到事件中——这个过程称为订阅事件或者向事件登记——而不是添加到事件基于的委托。

  订阅事件

  类似于委托,事件也用+=操作符进入就绪状态。我们使用+=操作符订阅事件。例如:

  class TemperatureMonitor{

  public delegate void StopMachineryDelegate();

  public event StopMachineryDelegate MachineOverheating; //声明事件

  ..........

  }

  .......

  TemperatureMonitor tempMonitor = new TemperatureMonitor();

  ......

  tempMonitor.MachineOverheating += () => {folder. StopFolding(0)};

  tempMonitor.MachineOverheating += welder.FinishWelding;

  tempMonitor.MachineOverheating += painter.PaintOff;

  tempMonitor.MachineOverheating 事件发生时,会调用所有订阅该事件的方法。

  取消订阅事件

  +=操作符用于订阅事件;对应地,-=操作符用于取消订阅。-=操作符将一个方法从事件的内部方法集合中移除。这个行动通常称为取消订阅事件或者从事件注销。

  引发事件

  和委托相似,可以把事件当作方法来调用,从而引发该事件。引发事件后,订阅了该事件的方法会依次调用。

  class TemperatureMonitor{

  public delegate void StopMachineryDelegate();

  public event StopMachineryDelegate MachineOverheating; //声明事件

  ..........

  private void Notify()

  {

  if(this.MachineryOverheating !=null)

  {

  this.MachineryOverheating(); //引发事件

  }

  }

  }

转载于:https://www.cnblogs.com/linhuide/p/5819910.html

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

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

相关文章

pymol怎么做底物口袋表面_怎么从文献中发掘一篇新文章?

本文来自微信公众号:X-MOLNews可能你的导师也曾说过这样的话——盯着Nature、Science级别的文章做,可能最终会中十分的文章;如果盯着十分的文章做,可能最终发出来也就五六分;但如果就为了发个文章混毕业,很…

如何分析线程转储– IBM VM

本文是我们的线程转储分析系列的第4部分,它将为您概述什么是IBM VM的JVM线程转储以及您将找到的不同线程和数据点。 您将看到和学习​​到,IBM VM Thread Dump格式是不同的,但是提供了更多现成的故障排除数据。 在这一点上,您应该…

VMware vSphere克隆虚拟机

参考资料:http://blog.csdn.net/shen_jz2012/article/details/484167711. 首先将你所要克隆的虚拟机关掉2. 选择你的ESXI服务器选中"配置",然后选中存储器右键你的存储介质,比如我的是datastore1,选择“浏览数据存储”。…

将本地jar包倒入maven项目类库中

有两种方法&#xff1a;1.本地下载maven并配置环境变量&#xff0c;然后运行cmd控制台输入 mvn install:install-file -Dfile本地jar路径 -DgroupId -DartifactId -Dpackagingjar -Dversion -DgeneratePomtrue. 2.直接在pom.xml中对应的依赖下面添加<scope>system&l…

Spring和JSF集成:分页

处理大型数据集时&#xff0c;通常需要以分页格式显示数据。 分页是一个有趣的问题&#xff0c;因为它倾向于跨越应用程序的所有层&#xff0c;从视图层通过应用程序服务一直到对数据库的原始调用。 在获取分页数据时&#xff0c;有一些非常好的解决方案。 如果您使用的是JPA&a…

三重积分平均值_直角坐标系下的三重积分的几何可视化解释图解高等数学

12.4 直角坐标系下的三重积分三重积分假设 F(x,y,z) 为一个空间有界闭区域 D 上的函数. D 为下面立体椭球所占区域. 将空间区域分割成小长方块. 体积记为 ΔVk, 其长宽高分别为Δxk, Δyk, Δzk , 并有下列的求和式:观察下面动画, 当空间不断分割, 每个小方块的体积 ΔVk 不断变…

最短网络Agri-Net

【例4-11】、最短网络Agri-Net【问题描述】农民约翰被选为他们镇的镇长&#xff01;他其中一个竞选承诺就是在镇上建立起互联网&#xff0c;并连接到所有的农场。当然&#xff0c;他需要你的帮助。约翰已经给他的农场安排了一条高速的网络线路&#xff0c;他想把这条线路共享给…

cors-synchronous-requests-not-working-in-firefox

http://stackoverflow.com/questions/16668386/cors-synchronous-requests-not-working-in-firefox转载于:https://www.cnblogs.com/diyunpeng/p/5829594.html

硬盘接口协议

硬盘是电脑主要的存储媒介之一&#xff0c;由一个或者多个铝制或者玻璃制的碟片组成。碟片外覆盖有铁磁性材料。硬盘有固态硬盘&#xff08;SSD 盘&#xff0c;新式硬盘&#xff09;、机械硬盘&#xff08;HDD 传统硬盘&#xff09;、混合硬盘&#xff08;HHD 一块基于传统机械…

图的表示

Python 数据结构与算法——图&#xff08;Graph&#xff09; 1. 邻接矩阵 vs 邻接表&#xff08;压缩的邻接矩阵&#xff09; 邻接矩阵的缺点是&#xff1a; 空间占用与结点数的平方成正比&#xff0c;可能带来很大的浪费&#xff1b;邻接矩阵不容易增加新的结点&#xff0c;不…

在Java Web应用程序中阻止CSRF

跨站点请求伪造攻击&#xff08;CSRF&#xff09;在Web应用程序中非常常见&#xff0c;如果允许&#xff0c;可能会造成重大危害。 如果您从未听说过CSRF&#xff0c;建议您查看有关它的OWASP页面 。 幸运的是&#xff0c;阻止CSRF攻击非常简单&#xff0c;我将向您展示它们的工…

windows命令行无法启动redis_windows系统安装redis

1、下载最新redis https://github.com/MicrosoftArchive/redis/releases我选择下载msi版本的2.双击下载包安装3.设置redis环境变量&#xff0c;把redis路径配置到系统变量path值中4启动redis&#xff0c;cmd进入安装好redis文件夹 输入&#xff1a;如果redis启动出错Creating S…

SQL Server 筛选时间区间

一、SQL直接判断 select * from login where pass>2013/03/25 and pass < 2017/04/24 二、DATEDIFF() 函数返回两个日期之间的时间 --语法 DATEDIFF(datepart,startdate,enddate) --开始时间 startdate --结束时间 enddate --datepart datepart缩写年yy, yyyy季度qq, …

OpenShift Express Web管理控制台:入门

本周&#xff0c; 最新版本的OpenShift为已经很棒的PaaS Cloud提供商带来了两个非常好的功能。 首先&#xff0c;JBoss AS已从7.0升级到7.1&#xff0c;并且所有新的Express Web Management Console已作为预览发布。 在本文中&#xff0c;我们将研究如何使用此新控制台&#xf…

Linux-IP地址后边加个/8(16,24,32)是什么意思?

是掩码的位数 A类IP地址的默认子网掩码为255.0.0.0&#xff08;由于255相当于二进制的8位1&#xff0c;所以也缩写成“/8”&#xff0c;表示网络号占了8位&#xff09;; B类的为255.255.0.0&#xff08;/16&#xff09;; C类的为255.255.255.0(/24) /30就是255…

女士细线毛衣起多少针_从起针到缝合,教你织毛衣的各种要点(详细教程)

新手学织毛衣看过来&#xff0c;7大编织要点帮你解决织好一件毛衣的基础问题&#xff0c;满满的干货&#xff0c;每点都值得学习!一、起针二、棒针符号三、如何织小样四、依据小样推算针数收挂肩的推算五、斜肩针数的推算开前、后领的位置与针数六、袖山的推算七、如何上袖子一…

关于OPENSSL的使用

#import <Foundation/Foundation.h> interface RSAEncryptor : NSObject /** * 加密方法 * * param str 需要加密的字符串 * param path .der格式的公钥文件路径 */ (NSString *)encryptString:(NSString *)str publicKeyWithContentsOfFile:(NSString *)path; /*…

Jelastic Java云端平台

谁在Jelastic背后&#xff1f; 那是我的第一个问题&#xff0c;因此我浏览了Jelastic网站。 回答此问题的最佳方法是查看“ Jelastic团队”部分。 创始人&#xff0c;顾问&#xff0c;特殊合作伙伴构成了一支真正的专业团队。 作为特殊的合作伙伴&#xff0c;您会发现MySQL&am…

请先设置tkk_搅拌站水泥罐仓顶除尘器设置及调整

搅拌站水泥罐仓顶除尘器采用脉冲喷吹清灰系统&#xff0c;除尘器本体结构&#xff0c;采用标准模板焊接&#xff0c;整体结构&#xff0c;强度牢靠&#xff0c;组装维修方便&#xff0c;脉冲清灰采用时序控制器MCY系列 控制阀门KEK系列&#xff0c;喷吹清灰频率及喷吹间隔可手…

Eclipse Meaven Spring SpringMVC Mybaits整合

本示例是在&#xff1a;Ubuntu15上实现的&#xff1b;Windows上安装Maven将不太相同。 Maven Install Run command sudo apt-get install maven, to install the latest Apache Maven.Run command mvn -version to verify your installation.Where is Maven installed? The co…