事件模型-温度预警问题

基于事件驱动的程序设计是目前主流的程序设计方法,它是windows应用程序设计和Web应用程序设计的基础。但长期以来,基于事件驱动模型都被广大初学者视为难以理解的内容。

其实,事件驱动的程序设计并不难理解,其过程与防灾救灾是相通的。

完整的时间处理系统必须包含以下三大组成要素:

1、事件源:指能出发事件的对象,有时又称为事件的发送者或事件的发布者。

2、侦听器:指能接受到事件消息的对象。Windows提供了基础的事件侦听服务。

3、时间处理程序:在事件发生时能对事件进行有效处理,又称事件方法或事件函数。包含事件处理程序的对象称为事件的接受者,有时又称事件的订阅者。

其实现步骤包括5个步骤:

1、定义事件相关信息类

2、在事件发布类(事件源)中声明事件,并声明一个负责出发事件的方法

3、在事件接受者类中声明事件发生时调用的方法

4、在事件接收者类中订阅事件

5、在事件接收者类中触发事件

本篇文章介绍一个用事件模型解决一个简单的问题:温度预警问题

模拟温度,每秒变化一次,随着温度的自动变化显示预警信息。

运行结果:

事件模型-温度预警问题

事件模型-温度预警问题

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Collections;

namespace Test1_2
{
    public partial class Test1_2 : Form
    {
        Random r = new Random();                                //产生一个随机数生成器
        TemperatureWarning tw = new TemperatureWarning();       //创建温度报警器对象
        public Test1_2()
        {
            InitializeComponent();
            //第四步:订阅事件
            tw.OnWarning += new TemperatureWarning.TemperatureHandler(tw_OnWarning);
        }
  
        private void Test1_2_Load(object sender, EventArgs e)
        {
            
        }
        //第三步,声明事件产生时调用的方法
        public void tw_OnWarning(object sender, TemperatureEventArgs e)
        {
            if (e.Temperature < 35)
            {
                lblShow.Text = "正常";
                lblColor.BackColor = Color.Blue;
            }
            else if (e.Temperature < 37)
            {
                lblShow.Text = "高温黄色预警";
                lblColor.BackColor = Color.Yellow;
            }
            else if (e.Temperature < 40)
            {
                lblShow.Text = "高温橙色预警";
                lblColor.BackColor = Color.Orange;
            }
            else
            {
                lblShow.Text = "高温红色预警";
                lblColor.BackColor = Color.Red;
            }
        }

        private void bntDouble_Click(object sender, EventArgs e)
        {
            //启动计时器,开始每一秒改变一次温度
            timer1.Enabled = true;                          
        }
        //每隔一秒激发一次该方法,用来模拟温度值的改变
        private void timer1_Tick(object sender, EventArgs e)
        {
            //现在的温度值
            int nowTemp = 0;
            if (textTemp.Text == "")
                nowTemp = 35;
            else
                nowTemp = int.Parse(textTemp.Text);

            int change = r.Next(-2, 3);                         //产生一个-2到2之间的随机数
            textTemp.Text = (nowTemp + change).ToString();      //新的温度值
            //第五步,触发事件
            tw.Monite(change + nowTemp);
        }
    }
    //第一步,定义事件相关信息类
    public class TemperatureEventArgs : EventArgs
    {
        private int temperature;
        //声明构造函数
        public TemperatureEventArgs(int temperature)
        {
            this.temperature = temperature;
        }
        //定义只读属性
        public int Temperature
        {
            get
            {
                return temperature;
            }
        }
    }
    //第二步,定义事件警报器
    public class TemperatureWarning
    {
        //2.1 声明温度预警的委托类型
        public delegate void TemperatureHandler(object sender, TemperatureEventArgs e);
        //2.2声明温度预警事件
        public event TemperatureHandler OnWarning;
        //2.3开始监控气温,同时发布事件
        public void Monite(int tp)
        {
            TemperatureEventArgs e = new TemperatureEventArgs(tp);
            if (OnWarning != null)
            {
                OnWarning(this, e);
            }
        }
    }
}

其中,Random类是伪随机数生成类,该类的Next(minValue, maxValue)方法可以产生一个大于等于minValue并小于maxValue的随机整数。

Timer控件是一个计时器控件,可以周期性产生一个Tick事件,可以用该控件周期性的执行某些操作。当Timer控件的Enable属性设置为true时,可以启用该控件:设置为false时,关闭计时,Interval属性是Timer控件的激发间隔,单位是毫秒。另外,一个事件方法只有订阅后才能生效,为此需要双击Timer1控件,在该控件方法中写入代码,以触发事件并模拟温度的变化。