C#观察者模式和事件委托的联合使用
发表于2018-09-02
观察者模式(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