观察者模式之烧开水

 观察者模式一直是架构设计中的重点模式

 比较常用的案例就是烧开水

 流程:烧水-->水烧开-->屏幕外显温度,报警器报警

 核心:委托和事件

 委托

          首先明确它是什么?其实是一个类,定义一个委托即定义一个类.

          那么是什么类?用来说明方法的类型的类。字段有类型,方法其实也有类型,就是委托。

          委托是某一类方法的定义。

   事件

          事件是某个类用于传递消息的方式。

          事件之于委托,犹如属性之于变量即是委托的封装。

   示例

        鼠标点击button对象,触发button的click事件,winform捕获到了事件然后进行了处理。

        winform是怎么捕获的呢?连接它们的桥梁其实是委托。winform通过某一类委托向button的click事件注册自己的方法,当事件发生时方法就被调用了。

    public delegate void WaterHeated(int i);
    public class WaterMachine
    {
        public event WaterHeated onWaterHeated;
        public void HeatWater()
        {
            for (int i = 0; i < 11; i++)
            {
                if (i < 10)
                {
                    Thread.Sleep(1000);
                    Console.WriteLine("水正在加热");
                }
                else
                {
                    OnWaterHeated(i);
                }
            }
        }

        internal void OnWaterHeated(int i)
        {
            if (onWaterHeated != null)
            {
                onWaterHeated(i);
            }
        }
    }

    public class Screen
    {
        public void ShowTemprature(int i)
        {
            Console.WriteLine("当前温度:{0}", i.ToString());
        }
    }

    public class Beeper
    {
        public void Alarm(int i)
        {
            Console.WriteLine("水已烧开");
        }
    }

static void Main(string[] args)
{
   //观察者
   WaterMachine wm = new WaterMachine();
   wm.onWaterHeated += (new Screen()).ShowTemprature;
   wm.onWaterHeated += (new Beeper()).Alarm;
   wm.HeatWater();
   Console.ReadKey();
}

 

posted @ 2018-06-30 14:14  王乐  阅读(273)  评论(0编辑  收藏  举报