委托与事件

今天又看了下.NET 下的委托与事件,从应用场景的角度重新想了一下,下面将这个记录下来:

现在先假设场景:

1.有一个气象台负责播报下雨。

2.一些需要步行上班的人,听到气象台预报下雨后要打伞上班。

3.一些骑车上班的人,听到预报下雨后要披雨披上班。

用委托和事件实现:

我的思路:

1.先定义一个气象台:

//气象台
public class WeatherStation
{
    //定义要下雨委托
    public delegate void WillRain();
    //实例委托
    public WillRain willRainDel;
}

 

2.定义走路上班的人和骑车上班的人:

//走路上班的人
public class WalkMan
{
    //监听天气预报
    public WalkMan(WeatherStation weatherSta)
    {
        //广播下雨时,要打伞
        weatherSta.willRainDel += TakeUmbrella;
    }

    //打伞
    public void TakeUmbrella()
    {
        Console.WriteLine("It will rain, I take umbrella.");
    }
}

//骑车上班的人
public class BikeMan
{
    //监听天气预报
    public BikeMan(WeatherStation weatherSta)
    {           
        //广播下雨时,要穿雨披
        weatherSta.willRainDel += TakePoncho;
    }

    //穿雨披
    public void TakePoncho()
    {
        Console.WriteLine("It will rain,I wear poncho.");
    }
}

 

现在来实例化气象台和走路与骑车的人,再来实现气象台播报下雨,走路的人打伞,骑车的人穿雨披:

 

static void Main(string[] args)
{
    //实例化气象台
    WeatherStation ws = new WeatherStation();
    //声明一个走路的人,并订阅气象台预报
    WalkMan Jason = new WalkMan(ws);
    //声明一个骑车的人,并订阅气象台预报
    BikeMan Tony = new BikeMan(ws);
    //气象台播报下雨
    ws.willRainDel();

    Console.Read();
}

 

这是执行程序就会得到这样的结果:

image

 

这个场景用委托就实现了,下面介绍用事件来实现,只需修改气象台类的委托实例替换为事件,同时类里来声明一个方法,调用这个事件。

 

//气象台
public class WeatherStation
{
    //定义要下雨委托
    public delegate void WillRain();
    //委托实例
    //public WillRain willRainDel;

   

       //Event来实现
        public event WillRain willRainEvent;
        public void WillRainTomorrow()
        {
            willRainEvent();
        }

}

 

走路的人和骑车的人也要进行相应的变化,因为委托实例已经被替换掉:

 

//走路上班的人
    public class WalkMan
    {
        //监听天气预报
        public WalkMan(WeatherStation weatherSta)
        {
            //广播下雨时,要打伞
            weatherSta.willRainEvent += TakeUmbrella;
        }

        //打伞
        public void TakeUmbrella()
        {
            Console.WriteLine("It will rain, I take umbrella.");
        }
    }

    //骑车上班的人
    public class BikeMan
    {
        //监听天气预报
        public BikeMan(WeatherStation weatherSta)
        {           
            //广播下雨时,要穿雨披
            weatherSta.willRainEvent += TakePoncho;
        }

        //穿雨披
        public void TakePoncho()
        {
            Console.WriteLine("It will rain,I wear poncho.");
        }
    }

 

这时在实现上面的场景时,main函数就变为:

    static void Main(string[] args)
    {
        //实例化气象台
        WeatherStation ws = new WeatherStation();
        //声明一个走路的人,并订阅气象台预报
        WalkMan Jason = new WalkMan(ws);
        //声明一个骑车的人,并订阅气象台预报
        BikeMan Tony = new BikeMan(ws);
        //气象台播报下雨
        //ws.willRainDel();
        //气象台播报下雨
        ws.WillRainTomorrow();

        Console.Read();
    }
}

将调用委托实例来预报天气变为直接调用方法来预报天气,运行结果是一样的:

image

转载于:https://www.cnblogs.com/readZhu/archive/2010/05/08/1730813.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值