C#中的委托和事件(小例子)

// 利用Observer设计模式模拟热水器工作过程。
// 参考资料:http://www.cnblogs.com/SkySoot/archive/2012/04/05/2433639.html
// 假设热水器由三部分组成:加热器、警报器、显示器,它们来自于不同厂商并进行了组装。
// 那么,应该是加热器仅仅负责烧水,它不能发出警报也不能显示水温;在水烧开时由警报器发出警报、显示器显示提示和水温。
// 事情发生的顺序应该是这样的:
// 1. 警报器和显示器告诉热水器,它对它的温度比较感兴趣(注册)。
// 2. 热水器知道后保留对警报器和显示器的引用。
// 3. 热水器进行烧水这一动作,当水温超过95度时,通过对警报器和显示器的引用,自动调用警报器的MakeAlert()方法和显示器的ShowMsg()方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DelegateEventExample
{
    /// <summary>
    /// 这是加热器,只负责烧水。
    /// 加热器是Observer模式中的被监视对象。当水温达到95度时,会触发监视它的方法。
    /// </summary>
    public class Heater
    {
        private int temperature; //水温,被监视对象。

        // 第一步:声明一个委托,并规定了委托的方法的参数类型为int
        public delegate void BoilHandler(int param);

        // 第二步:声明一个委托变量,该变量里可以存放(注册)很多方法
        public event BoilHandler BoilEvent;

        public void BoilWater()
        {
            for (int i = 0; i <= 100; i++)  //水温上升
            {
                temperature = i;
                if (temperature > 95)
                {
                    if (BoilEvent != null)
                    {
                        // 第五步:水温达到95度,调用所有注册对象的方法(监视者)。
                        BoilEvent(temperature);
                    }
                }
            }
        }
    }

    /// <summary>
    /// 这是报警器
    /// 报警器是Observer模式中的监视者。当水温达到95度时,报警器被触发并发出报警。
    /// </summary>
    public class Alarm
    {
        // 第六步:收到水温达标的通知,发生警报
        public void MakeAlert(int param)
        {
            Console.WriteLine("Alarm:嘀嘀嘀,水已经 {0} 度了:", param);
        }
    }

    /// <summary>
    /// 这是显示器
    /// 显示器是Observer模式中的监视者。当水温达到95度时,显示器被触发并显示温度。
    /// </summary>
    public class Display
    {
        // 第六步:收到水温达标的通知,显示水温  
        public static void ShowMsg(int param)
        {
            Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", param);
        }
    }

    class Program
    {
        static void Main()
        {
            Heater heater = new Heater();
            Alarm alarm = new Alarm();

            // 第三步:给委托变量注册方法,即告诉热水器有哪对象在监视它
            heater.BoilEvent += alarm.MakeAlert;
            heater.BoilEvent += Display.ShowMsg;

            // 第四步:开始烧水
            heater.BoilWater();
        }
    }
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值