观察者模式之烧开水
观察者模式一直是架构设计中的重点模式
比较常用的案例就是烧开水
流程:烧水-->水烧开-->屏幕外显温度,报警器报警
核心:委托和事件
委托
首先明确它是什么?其实是一个类,定义一个委托即定义一个类.
那么是什么类?用来说明方法的类型的类。字段有类型,方法其实也有类型,就是委托。
委托是某一类方法的定义。
事件
事件是某个类用于传递消息的方式。
事件之于委托,犹如属性之于变量即是委托的封装。
示例
鼠标点击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(); }