/*
* 假设我们有个高档的热水器,我们给它通上电,当水温超过95度的时候:
* 1、扬声器会开始发出语音,告诉你水的温度;
* 2、液晶屏也会改变水温的显示,来提示水已经快烧开了。
*
* 现在我们需要写个程序来模拟这个烧水的过程
* 我们将定义一个类来代表热水器,我们管它叫:Heater
* 它有代表水温的字段,叫做temperature;当然,还有必不可少的给水加热方法BoilWater(),
* 一个发出语音警报的方法MakeAlert(),一个显示水温的方法,ShowMsg()。
*/
using System;
using System.Threading;
namespace 事件_委托_观察者模式
{
class Program
{
static void Main(string[] args)
{
Heater heater = new Heater();
Alarm alarm = new Alarm(heater);
Display display = new Display(heater);
heater.BoilEvent += alarm.MakeAlert;
heater.BoilEvent += display.ShowMsg;
heater.BoilWater();
Console.ReadKey();
}
}
//热水器
public class Heater
{
//水温,一秒加一
private int temperature;
public string type = "RealFire 001"; // 添加型号作为演示
public string brand = "Gree"; // 添加品牌作为演示
//委托
public delegate void BoilHandler(Object sender, BoiledEventArgs e);
//事件
public event BoilHandler BoilEvent;
// 定义BoiledEventArgs类,传递给Observer所感兴趣的信息
public class BoiledEventArgs : EventArgs
{
public readonly int temperature;
public BoiledEventArgs(int temperature)
{
this.temperature = temperature;
}
}
// 可以供继承自 Heater 的类重写,以便继承类拒绝其他对象对它的监视
protected virtual void OnBoiled(BoiledEventArgs e)
{
if (BoilEvent != null)
{
// 如果有对象注册
BoilEvent(this, e); // 调用所有注册对象的方法
}
}
public void BoilWater()
{
for (int i = 0; i < 100; i++)
{
temperature = i;
if(temperature > 95)
{
OnBoiled(new BoiledEventArgs(temperature));
}
else
{
Console.WriteLine($"当前水温:{temperature}");
}
Thread.Sleep(1000);
}
}
}
//警报器
public class Alarm
{
private Heater heater;
//在构造函数中为热水器的事件添加监听
public Alarm(Heater _heater)
{
heater = _heater;
heater.BoilEvent += MakeAlert;
}
public void MakeAlert(Object sender,Heater.BoiledEventArgs e)
{
if(sender is Heater result)
{
Console.WriteLine("Alarm:{0} - {1}: ", result.type, result.brand);
Console.WriteLine("Alarm:嘀嘀嘀,水已经 {0} 度了:", e.temperature);
}
}
}
public class Display
{
private Heater heater;
//在构造函数中为热水器的事件添加监听
public Display(Heater _heater)
{
heater = _heater;
heater.BoilEvent += ShowMsg;
}
public void ShowMsg(Object sender, Heater.BoiledEventArgs e)
{
if (sender is Heater result)
{
Console.WriteLine("Display:{0} - {1}: ", result.type, result.brand);
Console.WriteLine("Display:嘀嘀嘀,水已经 {0} 度了:", e.temperature);
}
}
}
}