委托和观察者模式

来源:互联网 发布:安卓软件开发课程 编辑:程序博客网 时间:2024/05/22 08:35

  

  委托在.Net中应用的非常广泛。它实现了对函数的封装,可以当做给方法的特征指定一个名称,将方法当做另一个方法的参数进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中使用过多的判断(条件)语句.现在将从我们生活中常见的事情——水沸腾了进行警报,进行对比实现。


一般写法:


<span style="font-family:SimSun;font-size:14px;">//一般的写法()Public class Heater//热水器{Private int temperature;privatevoidBoilWater()//烧水{for(inti=0;i<=100;i++){temperature=i;}}}Public class Alarm//警报器{Private void MakeAlert(intparam){Console.WriteLine("Alarm:嘀嘀嘀,水已经{0}度了:",param);}}Public class Display//显示器{privatevoidShowMsg(intparam){Console.WriteLine("Display:水已烧开,当前温度:{0}度。",param);}}</span><span style="font-size:18px;font-family: KaiTi_GB2312;"></span>


  PS:一般写法是从网上找的,重点在于通过委托和观察者模式对上述代码进行改造


委托改造:


  加热器类

<span style="font-family:SimSun;font-size:14px;">//使用委托进行简单改造namespace ConsoleApplication1{    /// <summary>    /// 加热器类    /// </summary>    class Heater    {                public void BoilWater(int i)        {            Console.WriteLine("当前温度:" + i);            if (BoilWaterMessage != null)<span style="color:#ff0000;">//如果Heater方法被执行时,没有对象注册事件,则执行BoilWaterMessage</span>            {                BoilWaterMessage();            }        }        public delegate void BoilWaterEventHandler();<span style="color:#ff0000;">//声明一个委托,也就是被监听的事件名称</span>        public event BoilWaterEventHandler BoilWaterMessage;//<span style="color:#ff0000;">声明BoilWaterMessage  事件类型是上面所声明的委托类型</span>    }  }</span><span style="font-family:KaiTi_GB2312;font-size:18px;"></span>


  警报类


namespace ConsoleApplication1{    /// <summary>    /// 警告类    /// </summary>    class Alarm    {        public void MessageAlert()        {            Console.WriteLine("水以沸腾,请注意安全");        }    }}


  客户端


主运行程序namespace ConsoleApplication1{    class Program    {        static void Main(string[] args)        {            Heater heater1 = new Heater();                           Alarm alarm1 = new Alarm();                          //将警告类的MessageAlert 方法注册到BoilWaterMessage 委托中            heater1.BoilWaterMessage += new Heater.BoilWaterEventHandler(alarm1.MessageAlert);                         //原本BoilWater方法,因为被委托了警告事件,因此显示结果为:当前温度:i 水以沸腾,请注意安全                         heater1.BoilWater(100);            Console.Read();        }    }}

  运行结果:

  

  通过委托的改造,我们可以这样:委托与其所注册的方法具有完全相同的行为。换而言之,被监听对象(Heater)执行某个方法(BoilWater(100))时,注册在该方法(BoilWater(100))上的被委托方法(MessageAlert ())将会执行,总感觉有点触发器的味道!



观察者模式:

  抽象被观察者类:


    class AbstractHeater    {        //声明一个观察者集合类        private IList<Alarm> alarms = new List<Alarm>();        //注册观察者的方法        public void Attach(Alarm alarm)        {            alarms.Add(alarm);        }        /// <summary>        /// 通知        /// </summary>        public void Notify()        {            foreach (Alarm a in alarms)            {                a.Update();            }        }            }



  抽象观察者:


    abstract class AbstractAlarm    {        public abstract void Update();    }



  被观察内容:


    /// <summary>    /// 加热器类-被观察者    /// </summary>    class Heater:AbstractHeater    {        private int wendu;        //观察者所关注的东西        public int  Wendu        {            get            {                return wendu;            }            set            {                wendu = value;            }                                }         }      


  具体观察者:


    /// <summary>    /// 警告类    /// </summary>    class Alarm : AbstractAlarm    {        //观察者依赖被观察者        private Heater heater;        private String message;        public Alarm(Heater heater1, String message1)        {            this.heater = heater1;            this.message = message1;        }        public override void Update()        {            Console.WriteLine("当前温度是{0}度,请{1}加温",heater.Wendu,message);        }    }



  客户端:


    class Program    {        static void Main(string[] args)        {            Heater h1 = new Heater();            h1.Attach(new Alarm(h1, "停止"));            h1.Wendu = 100;            h1.Notify();            Console.Read();        }    }


  运行结果:





【.Net&&观察者】小结:

  仔细想想.Net中的委托和观察者模式似乎有着异曲同工之妙。步骤也近乎一样:

声明委托(被观察者)===》》》注册对象事件(抽象被观察者,任何在此注册的观察者都会被通知)===》》》将被委托的事件进行注册===》》》委托事件响应,执行被委托事件(被观察者状态改变,观察者进行相应变化)。













0 0
原创粉丝点击