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:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace dotNet之美__委托与事件__Observer观察者模式2
{
/// <summary>
/// 此例子是:热水器加热水,水温大于95度时报警器响起,显示器显示水温。
/// </summary>
class Program
{
static void Main(string[] args)
{
Heater heater = new Heater();
//订阅事件
heater.Boiled += new Alarm().AlarmAlert;
heater.Boiled += new Display().ShowMsg;
//也可以这样订阅
heater.Boiled += new Heater.BoiledEventHandler(new Alarm().AlarmAlert);
heater.BoilWater();
Console.ReadLine();
}
}
/// <summary>
/// 委托与事件实现:观察者设计模式(两种角色:监视者和被监视者)
/// </summary>
class Heater//被监视者(委托事件发布者)
{
//定义订阅者感兴趣的信息,比如:水温、热水器类型以及产地
//定义水温
private int temperature;
//热水器类型
public string type = "ReadFire 001";
//产地
public string area = "China Guangzhou";
/// <summary>
/// 声明一个委托类型
/// </summary>
/// <param name="sender">发布者对象</param>
/// <param name="e">订阅者感兴趣的信息参数</param>
public delegate void BoiledEventHandler(Object sender,BoiledEventArgs e);
/// <summary>
/// 定义委托事件
/// </summary>
public event BoiledEventHandler Boiled;
/// <summary>
/// 订阅者感兴趣的信息
/// </summary>
public class BoiledEventArgs : EventArgs
{
public readonly int temperature;
public BoiledEventArgs(int temperature)
{
this.temperature = temperature;
}
}
/// <summary>
/// 触发的事件
/// </summary>
/// <param name="e"></param>
public void OnBoiled(BoiledEventArgs e)
{
if (Boiled != null)
{
Boiled(this, e);
}
}
/// <summary>
/// 触发动作
/// </summary>
public void BoilWater()
{
for (int i = ; i <= ; i++)
{
this.temperature = i;
if (this.temperature > )
{
BoiledEventArgs e = new BoiledEventArgs(this.temperature);
OnBoiled(e);
}
}
}
}
/// <summary>
/// 订阅者
/// </summary>
class Alarm
{
/// <summary>
/// 报警
/// </summary>
/// <param name="sender">发布者即被监视者对象</param>
/// <param name="e">感兴趣的信息</param>
public void AlarmAlert(Object sender, Heater.BoiledEventArgs e)
{
Heater heater = (Heater)sender;
Console.WriteLine("Alarm:{0}-{1}", heater.area, heater.type);
Console.WriteLine("Alarm:嘀嘀嘀···水温:" + e.temperature);
}
}
/// <summary>
/// 订阅者
/// </summary>
class Display
{
/// <summary>
/// 显示温度
/// </summary>
/// <param name="sender">发布者即被监视者对象</param>
/// <param name="e">感兴趣的信息</param>
public void ShowMsg(Object sender, Heater.BoiledEventArgs e)
{
Heater heater = (Heater)sender;
Console.WriteLine("Display:{0}-{1}", heater.area, heater.type);
Console.WriteLine("水快被烧开了,水温:" + e.temperature);
}
}
}
运行结果:

C#委托与事件之观察者Observer设计模式的更多相关文章
- .Net之美读书系列(一):委托与事件
开启新的读书之旅,这次读的书为<.Net之美:.Net关键技术深入解析>. 我是选择性阅读的,把一些自己觉得容易忘记的,或者比较重要的知识点记录下来,以便以后能方便呢查阅. 尊重书本原作者 ...
- Observer设计模式中-委托事件-应用在消息在窗体上显示
Observer设计模式:监视者模式.在类中的方法中处理的结果或者消息通过事件委托 的方式发送给主窗体. 因为在其它类中直接访问主窗体类,显示内容是不能直接调用控件赋值的,当然也有别的类似查阅控件名, ...
- 转载:C#中委托、事件与Observer设计模式
原文地址 http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx 感谢博主分享! 范例说明 假设 ...
- 委托、事件与Observer设计模式
范例说明 上面的例子已不足以再进行下面的讲解了,我们来看一个新的范例,因为之前已经介绍了很多的内容,所以本节的进度会稍微快一些: 假设我们有个高档的热水器,我们给它通上电,当水温超过95度的时候:1. ...
- 观察者设计模式(C#委托和事件的使用)
观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新.在现实生活中的可见观察者模式,例如,微信中的订阅号,订阅博客和QQ微博中关注好友 ...
- C# ~ 从 委托事件 到 观察者模式 - Observer
委托和事件的部分基础知识可参见 C#/.NET 基础学习 之 [委托-事件] 部分: 参考 [1]. 初识事件 到 自定义事件: [2]. 从类型不安全的委托 到 类型安全的事件: [3]. 函数指针 ...
- C# 关于委托和事件的妙文:通过一个例子详细介绍委托和事件的作用;Observer模式简介
委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见 ...
- c#委托、事件、Observer
委托和事件在.NET Framework[1] 中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易. 中文名 委托 外文名 Delegate 编程语言 C# 作 ...
- 面向对象设计模式——观察者(OBSERVER)模式
定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...
随机推荐
- PHP 单链表
<?php class Hero { public $no; public $name; public $nickname; public $next=null; public function ...
- 引用类型和原始类型的对比(java)
Java 提供两种不同的类型:引用类型和原始类型(或内置类型).另外,Java 还为每个原始类型提供了封装类(Wrapper). 原始类型 封装类=================boolean Bo ...
- HTML中属性ID和属性NAME的区别(转)
ID和Name都可以用来标识一个标记,Javascript分别有两个方法getElementById和getElementByName来定位Dom节点. 区别如下: 1.我们知道在网页做Post提交时 ...
- jQuery mini ui 2
1.<a class="mini-button" iconCls="icon-add" onclick="addRow()" plai ...
- nginx环境下搭建nagios 3.5.0,及配置pnp4nagios画图
本文基于<LNMP最新源码安装脚本>,Nagios依赖PHP环境和perl环境,由于Nginx不支持Perl的CGI,需先来搭建Perl环境,Nagios原理介绍略.一.下载最新稳定源码包 ...
- BIND9详解之日志篇
在默认情况下,BIND把日志消息写到/var/log/messages文件中,而这些日志消息是非常少的,主要就是启动,关闭的日志记录和一些严重错误的消息,所以要详细记录服务器的运行状况,需要自己配置服 ...
- 使用 pm2 来守护 NoderCMS
pm2 是一个带有负载均衡功能的Node应用的进程管理器,使用 pm2 可以帮助你守护和监控 NoderCMS 的正常运行, 基于Node.js+MongoDB的轻量级内容管理系统NoderCMS ...
- Bash shell 笔记总结(一) 转自http://www.bubuko.com/infodetail-509992.html,谢谢原作者
本文是上课笔记总结,涉及细节知识点会在以后文章说明! bash脚本编程: 脚本程序:解释器解释执行: shell: 交互式接口:编程环境: shell: 能够提供一些内部命令,并且能通过PATH环境变 ...
- javascript 倒计时代码
<script language="javascript" type="text/javascript"> var interval = 1000; ...
- ARM汇编指令(未完待续)
ARM指令自己在看的时候,看完之后就忘了,根本记不住,而且有些ARM汇编指令在平常的时候可能根本就用不到,所以也没必要把所有的ARM指令都去记忆,所以自己就想着不去一遍一遍的复习ARM指令,而是在平常 ...