事件可以理解成封装性更好的委托,使得Publish-Subscribe(发布——订阅)模式更简洁且更不易出Bug。
若不使用事件,则可使用多播委托实现Publish-Subscribe(发布——订阅)模式。这里考虑一个温度控制的例子:
假设一个加热器(Heater)和一个冷却器(Cooler)连接到同一个温度计(Thermostat)。控制设备开关需要向它们通知温度变化。温度计(发布者)将温度变化发布给多个订阅者——也就是加热器和冷却器,加热器和冷却器根据温度器的变化而做出反应。
代码如下:
Thermostat.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//温度计类
public class Thermostat
{
//定义一个委托
//来自Publisher的温度变化通知会同时被Cooler和Heater的实例(Subscriber)所接收。
public Action<float> OnTemperatureChange{
get; set;}
private float _CurrentTemperature;
public float CurrentTemperature
{
get {
return _CurrentTemperature;}
set
{
if(value!=_CurrentTemperature)
_CurrentTemperature = value;
OnTemperatureChange?.Invoke(value);//6.0这样写,防止出现空委托Bug
}
}
}
Heater.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
//加热器类
public class Heater
{
public float TemperatureThreshold {
get; set; }
public Heater(float temperatureThreshold)
{
TemperatureThreshold = temperatureThreshold;
}
public void OnTemperatureChanged(float newTemperature)
{
if (newTemperature < TemperatureThreshold)
WriteLine("加热器开");
else
WriteLine("加热器关");
}
}
Cooler.cs