委托和事件的实战编程----12

60 阅读1分钟

加热器

 internal class Heater
    {
        //水温
        private int temperature;

        //计时器
        private Timer heatTimer;

        //事件和委托的声明
        public delegate void BoiledEventHandler(object sender, TempratureEventArgs tea);
        //事件是基于委托的
        public event BoiledEventHandler boiledEvent;
        public Heater(int startTemperature) 
        { 
            this.temperature = startTemperature;
            this.heatTimer = new Timer(1000);
        }

        //每隔一秒,水温上升1°----烧水
        public void BoilWater(object sender,ElapsedEventArgs e)
        {
            //温度递增
            this.temperature++;
            if (this.temperature == 100)
            { 
                (sender as Timer).Stop();
            }
            //事件数据封装
            TempratureEventArgs tea = new TempratureEventArgs(temperature);

            //触发事件
            if (boiledEvent != null)
            {
                //参数:触发事件的对象,封装了温度信息的类对象
                boiledEvent(this, tea);
            }
        }

        public void StartBoilWater() 
        {
            //方法的注册
            heatTimer.Elapsed += BoilWater;
            //启动计时器
            heatTimer.Start();
        }

    }

显示器

 internal class Displayer
    {
        //显示温度
        public void ShowMessage(object sender, TempratureEventArgs tea) 
        {
            Console.WriteLine("当前水温{0}摄氏度",tea.temperature);
        }
    }

报警器

 internal class Alarm
    {
        //发出警报
        public void MakeAlarm(object sender, TempratureEventArgs tea)
        {
            if (tea.temperature >= 95)
            {
                if (tea.temperature == 100)
                {
                    Console.WriteLine("水已沸腾");
                }
                else 
                {
                    Console.WriteLine("水快开了,注意安全");
                }
            }
        }
    }

温度数据类

 internal class TempratureEventArgs:EventArgs
    {
        //温度
        public int temperature;
        public TempratureEventArgs(int temperature)
        {
            this.temperature = temperature;
        }   
    }

主程序类

 //代码模拟热水器,加热器、显示器、警报器
    internal class Program
    {
        static void Main(string[] args)
        {
            WaterHeatTest();
        }

        static void WaterHeatTest()
        {
            Heater heater = new Heater(90);
            Displayer displayer = new Displayer();
            //创建警报器对象
            Alarm alarm = new Alarm();

            //方法注册
            heater.boiledEvent += displayer.ShowMessage;
            heater.boiledEvent += alarm.MakeAlarm;
            heater.StartBoilWater();
            Console.ReadLine();
        }
    }