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 ...
随机推荐
- SQL Server 数据库邮件 配置
在 Sqlserver 上尝试配置 数据库邮件,用 smtp.qq.com 来发送邮件 如下配置后,发送测试邮件遇到错误 “由于邮件服务器故障,无法将邮件发送给收件人. (使用帐户 1 (2015-1 ...
- div中实现居中
今天纠结了大半天的居中,把学到的先记录下来,还没完全弄清楚,发现网上原创的技术贴并不算多,大多都是相互转载.(ps.先安利一个大神的帖集,昨天才发现的,内容丰富,语言,呃...很幽默,一般都是图文并茂 ...
- N!水题
//题目是求N!的问题,思路:设定一个整形数组来存放每次计算过后的值 有两个for循环,第一个for循环每次加进一个数 然后在第二个for循环里面计算出此时的阶乘,比如9999,先给出i=2 在第二个 ...
- iOS9中请求出现App Transport Security has blocked a cleartext HTTP (http://)
错误描述: App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecu ...
- Css Div半透明
用CSS控制外层DIV不透明,而内层DIV透明,这样实现的效果是意想不到的,还不错吧,其实代码也是很简单的,也很好理解,主要是用了CSS的滤镜. <html xmlns="http:/ ...
- 配置CAS错误No Certificate file specified or invalid file format
配置tomcat证书 keystore文件后启动一直报错:(tomcat版本:apache-tomcat-6.0.43) tomcat配置: <Connector port="8443 ...
- php wampp 访问数据库
//获取用户信息private function UlikeGetUserInfo($Wechat,$data) { $this->logger("到达UlikeFunction.in ...
- explode 结合 str_replace对获取的URL处理手记
今天更新我的一个FKQQ的程序.我的一个PHP文件接收到HQ的QQ号码的字符串.因为获取的内容有大量的垃圾内容所以我用str_replace做了一个处理代码如下: $xx1 = preg_replac ...
- Java Tomcat 中调用.net DLL的方法
近日一个java的项目,客户要求项目中必须使用其提供的加密机制,扔给了两个.net写的DLL.网络上搜了一圈也没找到啥东西,甚至看到人扬言此事绝无可能.郁闷当中考虑了一个思路.用C#做一个Com,调用 ...
- linux下实现ls()函数遍历目录
转载请注明原创:http://www.cnblogs.com/StartoverX/p/4600794.html 需求:在linux下遍历目录,输出目录中各文件名. 在linux下遍历目录的相关函数有 ...