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 }

运行结果:

时间: 2024-11-05 11:32:41

C#委托与事件之观察者Observer设计模式的相关文章

委托、事件与Observer设计模式

范例说明 上面的例子已不足以再进行下面的讲解了,我们来看一个新的范例,因为之前已经介绍了很多的内容,所以本节的进度会稍微快一些: 假设我们有个高档的热水器,我们给它通上电,当水温超过95度的时候:1.扬声器会开始发出语音,告诉你水的温度:2.液晶屏也会改变水温的显示,来提示水已经快烧开了. 现在我们需要写个程序来模拟这个烧水的过程,我们将定义一个类来代表热水器,我们管它叫:Heater,它有代表水温的字段,叫做temperature:当然,还有必不可少的给水加热方法BoilWater(),一个发

C# Observer设计模式(委托+事件)

Observer设计模式中主要包括如下两类对象: Subject:监视对象,它往往包含着其他对象所感兴趣的内容.在本范例中,热水器就是一个监视对象,它包含的其他对象所感兴趣的内容,就是temprature字段,当这个字段的值快到100时,会不断把数据发给监视它的对象. Observer:监视者,它监视Subject,当Subject中的某件事发生的时候,会告知Observer,而Observer则会采取相应的行动.在本范例中,Observer有警报器和显示器,它们采取的行动分别是发出警报和显示水

c#委托、事件、Observer

委托和事件在.NET Framework[1] 中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易. 中文名 委托 外文名 Delegate 编程语言 C# 作    用 方便的引用被委托的方法 目录 1引言 2参数 3委托 4由来 5编译代码 6设计模式 ? 范例说明 ? 模式简介 7委托事件 1引言编辑 c#委托和事件它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里憋得慌,浑身不自在.本文中,我将通过两个范例由浅

C# 关于委托和事件的妙文:通过一个例子详细介绍委托和事件的作用;Observer模式简介

委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在.本文中,我将通过两个范例由浅入深地讲述什么是委托.为什么要使用委托.事件的由来..Net Framework中的委托和事件.委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论. 一.为什么要使用委托 委托的应用之一:将一个方法作

四、集合与泛型、委托与事件-----《大话设计模式》

一.集合与泛型   数组 集合(ArrayList) 泛型 优点 连续存储.快速从头到尾遍历和修改元素 使用大小可按需动态增加 类型安全:省去拆箱和装箱操作 缺点 创建时必须制定数组变量的大小: 两个元素之间添加元素比较困难 类型不安全,接受所有类型的数据: 导致一直进行拆箱和装箱操作,带来很大的性能消耗   public partial class Form1 : Form { IList arrayAnimal_list = new ArrayList(); //声明并初始化集合 IList

【设计模式】HeadFirst设计模式(二):观察者(Observer)模式

一.观察者模式定义 在观察者模式中,一个被观察者管理所有依赖于它的观察者对象,它定义了一个一对多的依赖关系,这样一来,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新. 主题(被观察者)通过一个共同的接口来更新观察者,观察者依赖于此主题. 二.观察者模式例子--气象监测系统 描述: 气象监测系统分为三个部分:气象站(获取实际气象数据的物理装置).WeatherData对象(追踪来自气象站的数据,并更新布告板)和布告板(显示目前天气状况给用户看) 布告板分为三个:目前状况(显示Weath

委托、事件、Observer观察者模式的使用解析一

一.前言 委托.事件得理论我就不解释了,不会的时候觉得很难,会了发现挺简单的,回头想想其实在JavaScript中常常用到,譬如:setTimeout()就是典型的委托. 二.传统编码方式 传统的调用方式如下,如果新加语言方法需要修改SayHello方法,增加case很不方便扩展 /// <summary> /// 普通调用方式 /// </summary> public class TestOld { public void English(string name) { Cons

设计模式--观察者(Observer)

GOF给出的定义: Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. 定义了对象之间的一种一对多的依赖关系,这样,当一个对象的状态发生变化时,所有的依赖对象都被通知并自动更新. 包含观察者与被观察者(也称为主题) 使用场景: 1.有两个抽象类型相互依赖.将他

转:委托和事件详解

Delegate delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate类能够拥有一个签名(signature),并且它"只能持有与它的签名相匹配的方法的引用".它所实现的功能与C/C++中的函数指针十分相似.它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m.但与函数指针相比,delegate有许多函数委托和事件在 .Net Framework中的应用非常广泛指针不具备的优点.首先,函数指针只能指