zoukankan      html  css  js  c++  java
  • C#委托与事件之观察者Observer设计模式

    前言

       委托:

    委托是一种在对象里保存方法引用的类型,同时也是一种类型安全的函数指针。

    或委托可以看成一种表示函数的数据类型,类似函数指针.

    事件是特殊的委托
    观察者模式:
    两种角色:
    (1)Subject, 主题(被监视对象),它往往包含着 Observer 所感兴趣的内容。
    (2)Observer, 观察者,它观察 Subject。 当 Subject 中的某件事发生的时候(通常是它所感兴趣的内容改变的时候),会被自动告知,而 Observer 则会采取相应的行动(通常为更新自身状态或者显示输出)。

    1、Observer观察者模式:两种身份即监视者和被监视者,是一对多的关系。

    (1)被监视者即委托事件的发布者也就是定义委托事件的一方。

    (2)监视者即委托事件的订阅者。

    2、编码规范:

    (1)委托类型的名称都应该以EventHandler结束;

    (2)委托的原型定义有一个void返回值,并接受两个输入参数,一个是Object,另一个是EventArgs类型(或继承自EventArgs)。

    (3)事件的命名为委托去掉EventHandler之后剩余的部分。

    (4)继承自EventArgs的类型应该以EventArgs结尾。

    3、简单以“热水器加热水,水温大于95度时报警器响起,显示器显示水温”为例。

    Code:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 
      6 namespace dotNet之美__委托与事件__Observer观察者模式2
      7 {
      8     /// <summary>
      9     /// 此例子是:热水器加热水,水温大于95度时报警器响起,显示器显示水温。
     10     /// </summary>
     11     class Program
     12     {
     13         static void Main(string[] args)
     14         {
     15             Heater heater = new Heater();
     16             //订阅事件
     17             heater.Boiled += new Alarm().AlarmAlert;
     18             heater.Boiled += new Display().ShowMsg;
     19             //也可以这样订阅
     20             heater.Boiled += new Heater.BoiledEventHandler(new Alarm().AlarmAlert);
     21             heater.BoilWater();
     22             Console.ReadLine();
     23         }
     24     }
     25     /// <summary>
     26     /// 委托与事件实现:观察者设计模式(两种角色:监视者和被监视者)
     27     /// </summary>
     28     class Heater//被监视者(委托事件发布者)
     29     {
     30         //定义订阅者感兴趣的信息,比如:水温、热水器类型以及产地
     31         //定义水温
     32         private int temperature;
     33         //热水器类型
     34         public string type = "ReadFire 001";
     35         //产地
     36         public string area = "China Guangzhou";
     37         /// <summary>
     38         /// 声明一个委托类型
     39         /// </summary>
     40         /// <param name="sender">发布者对象</param>
     41         /// <param name="e">订阅者感兴趣的信息参数</param>
     42         public delegate void BoiledEventHandler(Object sender,BoiledEventArgs e);
     43         /// <summary>
     44         /// 定义委托事件
     45         /// </summary>
     46         public event BoiledEventHandler Boiled;
     47         /// <summary>
     48         /// 订阅者感兴趣的信息
     49         /// </summary>
     50         public class BoiledEventArgs : EventArgs
     51         {
     52             public readonly int temperature;
     53             public BoiledEventArgs(int temperature)
     54             {
     55                 this.temperature = temperature;
     56             }
     57         }
     58         /// <summary>
     59         /// 触发的事件
     60         /// </summary>
     61         /// <param name="e"></param>
     62         public void OnBoiled(BoiledEventArgs e)
     63         {
     64             if (Boiled != null)
     65             {
     66                 Boiled(this, e);
     67             }
     68         }
     69         /// <summary>
     70         /// 触发动作
     71         /// </summary>
     72         public void BoilWater()
     73         {
     74             for (int i = 0; i <= 100; i++)
     75             {
     76                 this.temperature = i;
     77                 if (this.temperature > 95)
     78                 {
     79                     BoiledEventArgs e = new BoiledEventArgs(this.temperature);
     80                     OnBoiled(e);
     81                 }
     82             }
     83         }
     84     }
     85     /// <summary>
     86     /// 订阅者
     87     /// </summary>
     88     class Alarm
     89     {
     90         /// <summary>
     91         /// 报警
     92         /// </summary>
     93         /// <param name="sender">发布者即被监视者对象</param>
     94         /// <param name="e">感兴趣的信息</param>
     95         public void AlarmAlert(Object sender, Heater.BoiledEventArgs e)
     96         {
     97             Heater heater = (Heater)sender;
     98             Console.WriteLine("Alarm:{0}-{1}", heater.area, heater.type);
     99             Console.WriteLine("Alarm:嘀嘀嘀···水温:" + e.temperature);
    100         }  
    101     }
    102     /// <summary>
    103     /// 订阅者
    104     /// </summary>
    105     class Display
    106     {
    107         /// <summary>
    108         /// 显示温度
    109         /// </summary>
    110         /// <param name="sender">发布者即被监视者对象</param>
    111         /// <param name="e">感兴趣的信息</param>
    112         public void ShowMsg(Object sender, Heater.BoiledEventArgs e)
    113         {
    114             Heater heater = (Heater)sender;
    115             Console.WriteLine("Display:{0}-{1}", heater.area, heater.type);
    116             Console.WriteLine("水快被烧开了,水温:" + e.temperature);
    117         }  
    118     }
    119 }

    运行结果:

  • 相关阅读:
    PAT A1094 The Largest Generation (25 分)——树的bfs遍历
    PAT A1055 The World's Richest (25 分)——排序
    PAT A1052 Linked List Sorting (25 分)——链表,排序
    PAT A1076 Forwards on Weibo (30 分)——图的bfs
    辅导员
    辅导员面试
    C程序设计
    Excel VBA 基本概念
    Excel函数
    导入excel表的数据到数据库ssh
  • 原文地址:https://www.cnblogs.com/dean-Wei/p/4174193.html
Copyright © 2011-2022 走看看