目录
- 事件概述
- 观察者模式
上节中,我们从委托独自一方面进行了探究,本节将从事件独自一方面进行探究,希望能给大家留下有价值的信息。
- 事件概述
有过MFC开发的朋友都知道,在学习MFC入门时研究的Windows消息机制是这样的——首先应用程序从WinMan函数进入消息监听循环(消息监听器)中,如果用户触发了某事件,消息监听器就将消息路由到过程函数(消息处理函数)中,处理事件相关的逻辑。
这就好比在窗体应用程序中,主窗体有一个按钮Bt01,当用户点击该按钮时, 系统就将用户单击按钮的动作作为消息push到消息队列中等待处理,当时间片轮到该消息处理时,系统就会路由到应用程序中调用已注册的过程函数处理逻辑。此处的过程函数就是我们通常编写的事件处理方法。
在面向对象的编程中,事件模式就有些不一样了。.NET库将Windows消息封装到事件中了,这样,在两个对象之间就可以通过事件来相互通信了,而委托就用作封装事件处理方法上,简单点,就是事件处理函数的注册。
- 观察者模式
个人认为,该模式能清晰的描述事件的工作模式,下面就以烧水为例来进行详细的讲述。
现在,在烧水过程中主要有以下几个步骤:1.烧水,2.当水快烧开时鸣笛提示,3.鸣笛30秒后自动切断电源停止烧水,防止将水烧干。
因此,我们可以这样来设计代码:
public class Heater { private int timer; //水烧开后,鸣笛计时 private Boolean boiling; //烧水开关 /// <summary> /// 水壶烧水 /// </summary> public void BoilWater() { int temp = 0; boiling = true; while (boiling) { if(temp <= 100) { temp++; } else { AlertTip(); } if (timer == 30) { ShutDown(); } } } /// <summary> /// 鸣笛警报,并计时 /// </summary> private void AlertTip() { timer++; Console.WriteLine("Alarm:水快烧开了!"); } /// <summary> /// 自动关闭,停止烧水 /// </summary> private void ShutDown() { boil