码迷,mamicode.com
首页 > 其他好文 > 详细

委托和事件的区别

时间:2015-07-03 06:51:11      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

有了委托为什么还需要事件?笔者认为事件是为了对委托进一步封装,更能体现面向对象的思想,也使得程序具有更大的灵活性。

下面看一个观察者模式的代码。需求是:假设我们有个高档的热水器,我们给它通上电,当水温超过95度的时候:1、扬声器会开始发出语音,告诉你水的温度;2、液晶屏也会改变水温的显示,来提示水已经快烧开了。

热水器代码:

/// <summary>
    /// 热水器
    /// </summary>
    public class Heater
    {
        private int temperature;
        public string type = "RealFire 001";    // 添加型号作为演示    
        public string area = "China Xian";       // 添加产地作为演示 
        //声明委托 
        public delegate void BoiledEventHandler(Object sender, BoliedEventArgs e);
        //声明事件
        public event BoiledEventHandler Boiled;

        // 可以供继承自 Heater 的类重写,以便继承类拒绝其他对象对它的监视    
        protected virtual void OnBolied(BoliedEventArgs e)
        {
            // 如果有对象注册 
            if (Boiled != null)
            {
                Boiled(this, e); // 调用所有注册对象的方法      
            }
        }

        // 烧水。 
        public void BoilWater()
        {
            for (int i = 0; i <= 100; i++)
            {
                temperature = i;
                if (temperature > 95)
                {
                    //建立BoliedEventArgs 对象。 
                    BoliedEventArgs e = new BoliedEventArgs(temperature);
                    // 调用 OnBolied方法
                    OnBolied(e);
                }
            }
        }
    }

事件相关参数:

public class BoliedEventArgs : EventArgs
    {
        public readonly int temperature;
        public BoliedEventArgs(int temperature)
        {
            this.temperature = temperature;
        }
    }

警报器:

/// <summary>
    /// 警报器
    /// </summary>
    public class Alarm
    {
        public void MakeAlert(Object sender, BoliedEventArgs e)
        {
            Heater heater = (Heater)sender;
            //访问 sender 中的公共字段 
            Console.WriteLine("Alarm:{0} - {1}: ", heater.area, heater.type);
            Console.WriteLine("Alarm: 嘀嘀嘀,水已经 {0} 度了:", e.temperature);
            Console.WriteLine();
        }
    }

 

显示器:

/// <summary>
    /// 显示器
    /// </summary>
    public class Display
    {
        //静态方法
        public static void ShowMsg(Object sender, BoliedEventArgs e)
        {
            Heater heater = (Heater)sender;
            Console.WriteLine("Display:{0} - {1}: ", heater.area, heater.type);
            Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", e.temperature);
            Console.WriteLine();
        }
    }

 

代码调用:

            Heater heater = new Heater(); 
            Alarm alarm = new Alarm();
            heater.Boiled += alarm.MakeAlert; //注册方法 
            heater.Boiled += (new Alarm()).MakeAlert;    //给匿名对象注册方法 
            heater.Boiled += new Heater.BoiledEventHandler(alarm.MakeAlert); //也可以这么注册       
            heater.Boiled += Display.ShowMsg;    //注册静态方法
            heater.BoilWater(); //烧水,会自动调用注册过对象的方法
            Console.ReadLine();

 

委托和事件的区别

标签:

原文地址:http://www.cnblogs.com/laixiancai/p/4617576.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!