委托、事件、观察者模式

/*
 * 假设我们有个高档的热水器,我们给它通上电,当水温超过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);
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值