开发模式

------------恢复内容开始------------

Observer设计模式是为了定义对象间的一种一对多的依赖关系,以便于当一个对象的状态改变时,其他依赖于它的对象会被自动告知并更新。Observer模式是一种松耦合的设计模式。

Observer设计模式中主要包括如下两类对象:

  1. Subject:监视对象,它往往包含着其他对象所感兴趣的内容。在本范例中,热水器就是一个监视对象,它包含的其他对象所感兴趣的内容,就是temprature字段,当这个字段的值快到100时,会不断把数据发给监视它的对象。
  2. Observer:监视者,它监视Subject,当Subject中的某件事发生的时候,会告知Observer,而Observer则会采取相应的行动。在本范例中,Observer有警报器和显示器,它们采取的行动分别是发出警报和显示水温。
  3. 在本例中,事情发生的顺序应该是这样的:

    1. 警报器和显示器告诉热水器,它对它的温度比较感兴趣(注册)。
    2. 热水器知道后保留对警报器和显示器的引用。
    3. 热水器进行烧水这一动作,当水温超过95度时,通过对警报器和显示器的引用,自动调用警报器的MakeAlert()方法、显示器的ShowMsg()方法。
      using System;
      using System.Collections.Generic;
      using System.Text;

      namespace Delegate {
          // 热水器
          public class Heater {
             private int temperature;
             public delegate void BoilHandler(int param);   //声明委托
             public event BoilHandler BoilEvent;        //声明事件

             // 烧水
             public void BoilWater() {
                 for (int i = 0; i <= 100; i++) {
                    temperature = i;

                    if (temperature > 95) {
                        if (BoilEvent != null) { //如果有对象注册
                            BoilEvent(temperature);  //调用所有注册对象的方法
                        }
                    }
                 }
             }
          }
          // 警报器
          public class Alarm {
             public void MakeAlert(int param) {
                 Console.WriteLine("Alarm:嘀嘀嘀,水已经 {0} 度了:", param);
             }
          }

          // 显示器
          public class Display {
             public static void ShowMsg(int param) { //静态方法
                 Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", param);
             }
          }
         
          class Program {
             static void Main() {
                 Heater heater = new Heater();
                 Alarm alarm = new Alarm();

                 heater.BoilEvent += alarm.MakeAlert;    //注册方法
                 heater.BoilEvent += (new Alarm()).MakeAlert;   //给匿名对象注册方法
                 heater.BoilEvent += Display.ShowMsg;       //注册静态方法

                 heater.BoilWater();   //烧水,会自动调用注册过对象的方法
             }
          }
      }
      输出为:
      Alarm:嘀嘀嘀,水已经 96 度了:
      Alarm:嘀嘀嘀,水已经 96 度了:
      Display:水快烧开了,当前温度:96度。
      // 省略...

       

------------恢复内容结束------------

上一篇:【quartz】quartz的基本使用


下一篇:[OpenCV] 图像亮度和对比度调整