事件与委托的简单应用

      刚刚看完委托与事件,故发个例子实现一下,牢固记忆,也帮助暂时未能理解的朋友.

      在以下的例子里,我们简单的实现了事件与委托之间的联接,

      对于委托,我们可以这样想,他可以是一个C++中的函数指针,但在C#里面为了类型安全等因素,委托便应运而生。

  委托能够想对待变量一样的对待方法。

      对于事件,Windows窗体的编程模型基于事件,这是微软的解释。我本人也没什么自己的看法....

 

      而在学习模式的同时,我们也能发现,对于这样的发布者与订阅者之间的关系,刚好也能体现了我们的"观察者"模式.

所谓的"观察者"模式又叫发布与订阅模式,

          观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。(以上定义转自:大话设计模式)

 

 

namespace eventMyWeather
{
    
enum Weather
    
{
        星期一潮湿 
= 1,
        星期二天晴,
        星期三雨,
        星期四天晴,
        星期五暴雨,
        星期六雷暴,
        星期天天晴
    }


    
/// <summary>
    
/// 创建发布者类
    
/// </summary>

    class weatherPublish
    
{
        Weather w;      
//声明枚举变量以存储天气
        public delegate void Publish(Weather w);    //创建委托
        public event Publish Pub = null;            //创建以Publish为委托的事件
        public weatherPublish()        //构造函数,获取当前天气
        {
            w 
= new Weather();
            w 
= (Weather)Convert.ToInt32(DateTime.Now.DayOfWeek);
            
//Console.WriteLine(w);
        }

        
public void onPain()        //发布天气
        {
            
if (Pub != null)
            
{
                Console.WriteLine(
"气象台发布天气!");
                Pub(w);
            }

        }

    }



    
/// <summary>
    
/// 创建订阅者类
    
/// </summary>

    class subScriber        //创建订阅者
    {
        
private string name;
        
public subScriber(string name)
        
{
            
this.name = name;
        }

        
public void reciveWeather(Weather w)
        
{
            Console.WriteLine(name
+"订阅天气!");
            Console.WriteLine(
"当前天气为:"+w);
            Console.ReadLine();
        }

    }


    
/// <summary>
    
/// 发布与订阅的实例
    
/// </summary>

    class CCTV
    
{
        
static void Main(string[] args)
        
{
            weatherPublish wp 
= new weatherPublish();
            subScriber zs 
= new subScriber("张三");    //创建订阅者
            subScriber ls = new subScriber("李四");  
            wp.Pub 
+= new weatherPublish.Publish(zs.reciveWeather);     //张三订阅天气预报
            wp.Pub += new weatherPublish.Publish(ls.reciveWeather);     //李四订阅天气预报
            wp.onPain();
        }
        
    }

}

 

posted on 2008-11-28 18:02  兴说:  阅读(482)  评论(0)    收藏  举报