在c#中multicast委托实现一个通用的模式,目的是避免大量的手工代码,这个模式成为observer或者是publish-subscribe模式,它要应对这样一种情形:你需要将单一的事件通知(比如对象状态发生的一个变化)广播给多个订阅者。
下面以一个温度控制的例子,在这个假象的情形中,一个加热器(heater)一个冷却器(cooler)连接到一个自动调温器。
为了控制加热器和冷却器的打开和关闭,要向他们通知温度的变化,调温器自动将温度的变化发布给多个订阅者--也就是加热器和冷却器。
首先定义加热器(Herter)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Herter
{
public Herter(float temperature)
{//构造函数
Temperature = temperature;
}
public float Temperature
{//属性
get { return _Temperature; }
set { _Temperature = value; }
}
private float _Temperature;
public void onTemperatureChange(float newTemperature)
{
if (newTemperature > Temperature)
{
Console.WriteLine("Heater:关闭");
}
else
{
Console.WriteLine("Heater:打开");
}
}
}
}
在定义冷却器(cooler)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Cooler
{
public Cooler(float temperature)
{//构造函数
Temperature = temperature;//初始化属性
}
public float Temperature //属性
{
get { return _Temperature; }
set { _Temperature = value; }//给字段赋值
}
private float _Temperature;
public void onTemperatureChange(float newTemperature)
{
if (newTemperature > Temperature)
{
Console.WriteLine("Cooler:打开");
}
else
{
Console.WriteLine("Cooler:关闭");
}
}
}
}
在定义调温器
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Thermostat
{
//定义委托,定义了订阅者的方法的签名
public delegate void TemperatureChangeHandler(float newTemperature);
//委托类型的属性,用来存储订阅者列表,注意:只需要一个委托字段即可存储所有订阅者
public TemperatureChangeHandler OnTemperatureChange
{
get { return _OnTemperatureChange; }
set { _OnTemperatureChange = value; }
}
private TemperatureChangeHandler _OnTemperatureChange;
public float CurrentTemperature
{
get { return _CurrentTemperature; }
set {
if(value!=CurrentTemperature)
{
_CurrentTemperature = value;
OnTemperatureChange(value);
//这个语句将温度的变化发布给冷却器和加热器对象,我们只是执行了一个调用,即可以向订阅者发出通知
}
}
}
private float _CurrentTemperature;
}
}
最后是调用
class Program
{
static void Main(string[] args)
{
Thermostat thermostat = new Thermostat();
Herter heater = new Herter(60);
Cooler cooler = new Cooler(80);
string temperature;
thermostat.OnTemperatureChange += heater.onTemperatureChange;
thermostat.OnTemperatureChange += cooler.onTemperatureChange;
Console.WriteLine("请输入温度");
temperature = Console.ReadLine();
thermostat.CurrentTemperature = int.Parse(temperature);
Console.ReadKey();
}
}
下来咱们看看结果吧