1、观察者模式
关于观察者模式,不在赘述,本质是利用event和handler配合,event本质是handler的实例,通过在event挂载事件实现内存级别的程序的通知机制.下面通过代码来展示常用观察者模式的构建方式.
(1)、需求
假设X工厂有一台锅炉,现在需要一个监测程序,该程序监测锅炉的温度,当温度达到66读,提醒相关的控制电脑.
核心代码如下:
public delegate void EventHandler(); /// <summary> /// 机器类 /// </summary> public class TraditionMachine { public string Name { get { return "传统锅炉"; } } public event EventHandler _temperatureWarnHandler; public void Run() { for (var i = 0; i < 100; i++) { //模拟温度达到66读触发警报 if (i == 66) { //经过一系列的计算 var computeValue = i; _temperatureWarnHandler.Invoke(); } } } } /// <summary> /// 温度警报参数,该参数存放一些不属于Machine属性的值,这里面的参数通常是经过计算得到的 /// 如果传递的是Machine属性,则直接通过this传递了(因为sender类型是object所以可以传递任意类型) /// </summary> public class TemperatureWarnEventArgs : EventArgs { public int ComputeVlaue { get; set; } public TemperatureWarnEventArgs(int computeVlaue) { ComputeVlaue = computeVlaue; } } /// <summary> /// 电脑A /// </summary> public class ComputerA { /// <summary> /// 电脑弹框警报 /// </summary> public void ShowWarnBox() { Console.WriteLine($"电脑A发出警报温度过高"); } } /// <summary> /// 电脑B /// </summary> public class ComputerB { /// <summary> /// 电脑弹框警报 /// </summary> public void ShowWarnBox() { Console.WriteLine($"电脑B发出警报温度过高"); } }
调用代码如下:
var machine = new TraditionMachine(); var computerA = new ComputerA(); var computerB = new ComputerB(); machine._temperatureWarnHandler += computerA.ShowWarnBox; machine._temperatureWarnHandler += computerB.ShowWarnBox; machine.Run();
输出如下: