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

发表于2018-09-02
评论0 2k浏览
观察者模式(Observer Pattern)有时又被称为订阅——发布模式,它主要应对这样的场景:需要将单一事件的通知(比如对象状态发生变化)广播给多个订阅者(观察者)。下面我们就来说说观察者模式和事件委托的联合使用。

直接上代码:
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
来自:https://blog.csdn.net/Fenglele_Fans/article/details/78688211

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引