c#观察者模式和事件委托的联合使用

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

//观察者模式和事件委托的联合使用
namespace 委托和事件2
{
    //热水器的类,被监视的对象
    public class Heater
    {
        private int temperature;//水温
        public delegate void heatEventHandler(int para);
        public event heatEventHandler heat;  //声明事件 事件的命名为委托去掉EventHandler之后的部分
        //烧水
        public void boilWater()
        {
            for (int i = 0; i <= 100; i++)
            {
                temperature = i;
                if (temperature >= 98)
                {
                    if (heat != null) //有方法注册进事件中
                    {
                        heat(temperature); //在条件满足的情况下通知观察者
                    }
                }
            }

        }
    }

    //警报类,observer的角色
    public class Alarm
    {
        public void boilVoice(int para)
        {
            Console.WriteLine("嘀嘀嘀");
        }
    }
    //显示类。显示水温,observer的角色
    public class Show
    {
        public void ShowTemperature(int para)
        {
            Console.WriteLine("水温已经{0}度了",para);
        }
    }

    //
    class Program
    {
        static void Main(string[] args)
        {
            Heater heater = new Heater();
            Alarm alarm = new Alarm();
            Show show = new Show();
            heater.heat += alarm.boilVoice;
            heater.heat += show.ShowTemperature;
            heater.boilWater();
            Console.Read();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 事件访问器
{
    //定义委托
    public delegate string GeneralEventHandler();
    //定义事件的发布者
    public class Publisher
    {
        private GeneralEventHandler _delegate;
        public event GeneralEventHandler geneal //事件访问器的定义
        {
            add { _delegate = value; }
            remove { _delegate -= value; }
        }
        public void DoSomething()
        {
            if (_delegate != null)
            {
                string str = _delegate();
                Console.WriteLine(str);
            }
        }
    }
    //定义事件的订阅者
    public class Subscriber
    {
        public string method()
        {
            return "liK";
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            Publisher ps = new Publisher();
            Subscriber sb = new Subscriber();
            ps.geneal += sb.method;
            ps.DoSomething();
            Console.Read(); 
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 委托和事件返回值研究
{
    public delegate string testEventHandler();
    class AA
    {
        public testEventHandler test;
        public void method()
        {
            if (test != null)
            {
                Console.WriteLine(test());
            }
        }
    }
    class BB
    {
        public static string bb()
        {
            return "likang01";
        }
    }
    class CC
    {
        public static string cc()
        {
            return "likang02";
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            AA aa = new AA();   //委托变量可以供对个订阅者注册,如果定义了返回值,那么对个订阅者都会向发布者返回数值
            aa.test = BB.bb;    //结果就是后面的一个返回值将前面的返回值覆盖了,实际上只能获得最后一个方法调用的返回值
            aa.test += CC.cc;
            aa.test -= CC.cc;
            aa.method();
            Console.Read();
        }
    }
}

这篇文章是学习博客园一位大神的笔记吧,大神还写了事件和委托的高级篇,无赖不甚理解,暂时不上了,要看的直接访问http://www.cnblogs.com/JimmyZhang/archive/2008/08/22/1274342.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值