日期:2014-05-17  浏览次数:20985 次

用C#中的委托和事件简单实现观察者模式

       天轰川视频在20多集的时候提到了委托,第一次学楚广明C#的时候对这块了解不深,这次把这块好好了解了下,算对这块有个入门级的认识。

       首先看官方对委托的定义(出自MSDN):委托是一种定义方法签名的类型,用于将方法作为参数传递给其他方法。事件处理程序就是通过委托调用的方法。

       我的理解:委托封装了方法,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。


用C#中的委托和事件简单的实现观察者模式是我在学习别人的博客中跟着敲的小例子,如下:

        这是一个模拟烧水的过程,我们将定义一个类来代表热水器,我们管它叫:Heater,它有代表水温的字段,叫做temperature;当然,还有必不可少的给水加热方法BoilWater()。定义一个报警器类Alarm,它有一个发出语音警报的方法MakeAlert()。一个现实板类Display,有一个显示水温的方法,ShowMsg()。

namespace Delegate
{
    class Program
    {
        //定义热水器类
        public class Heater {
            //定义水的温度
            private int temperature;
            //声明委托
            public delegate void BoilHandler(int param);
            //声明事件
            public event BoilHandler BoilEvent;
            //加热水的方法
            public void BoilWater() 
            {
                for (int i = 0; i <= 100; i++)
                {
                    temperature = i;
                    //如果水温超过95度,执行绑定到事件上的方法
                    if (temperature >= 95) {
                        if (BoilEvent != null)   //如果有对象注册
                        {   
                            BoilEvent(temperature);  //调用所有注册对象的方法
                        }
                    }
                }
            }

        }
        //警报器类,当水超过一定温度时,即发出警报
        public class Alarm {
            //发出警报
            public void MakeAlert(int param)
            {
                Console.WriteLine("Alarm:嘀嘀嘀,水已经烧到{0}度了", param);
            }
        }

        //显示板类,用来显示水的温度
        public class Display 
        {
            public static void ShowMsg(int param)
            {
                Console.WriteLine("Display:水快开了,当前温度是{0}", param);
            }
        }

        static void Main(string[] args)
        {
            Heater ht = new Heater();
            Alarm alarm = new Alarm();
            //将警报器和现实板(监视者Oberser)的方法绑定到热水器(监视对象Subject)的事件上
            ht.BoilEvent += alarm.MakeAlert;   //注册方法
            ht.BoilEvent += (new Alarm()).MakeAlert;    //注册匿名对象的方法
            ht.BoilEvent += Display.ShowMsg;  //注册静态方法

            ht.BoilWater();   //加热水,会自动调用注册过的对象的方法

        }
    }
}


2楼lfmilaoshi2小时前
重要的的基础知识n米老师
Re: xqf3092小时前
回复lfmilaoshin恩
1楼liushuijinger昨天 23:18
好文 顶
Re: xqf309昨天 23:55
回复liushuijingern谢拉