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();

输出如下:

观察者模式的另一种实现方式IChangeToken

 

相关文章:

  • 2021-04-26
  • 2021-05-22
  • 2021-05-22
  • 2021-07-15
  • 2021-07-19
  • 2021-12-13
  • 2022-12-23
猜你喜欢
  • 2021-06-24
  • 2021-07-21
  • 2021-11-06
  • 2021-09-22
  • 2022-12-23
  • 2021-12-12
  • 2021-11-07
相关资源
相似解决方案