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 ...
随机推荐
- Tab标签栏 切换 权威总结
angular的标签栏,有两种方法实现: 内容全部加载到页面中,再利用ng-show指令. 将每一块要加载的内容做成模板,利用ng-if指令加载. 用bootstrap的tab组件 用angular的 ...
- ASP.NET协作应用集成到trsids身份验证服务器的开发流程
开发Actor协同模块: (参考TRSIDS4.0 协作应用集成手册[asp.net]) ASP.Net协作应用集成到IDS之前,需要开发Actor类实现协作应用回调接口中定义的本地登录.退出.用户信 ...
- 关于在repeater中的checkbox实行多选和全选
今天项目中用到这一块,是一个b2b商城,业务是别人给客户留言后,客户从会员中心的留言管理中查看,用checkbox实行多选和全选后进行批量审核 首先在checkbox后加个hidden,作用见代码: ...
- Mysql 索引案例学习
理解索引最好的办法是结合示例,所以这里准备了一个索引的案例. 假设要设计一个在线约会网站,用户信息表有很多列,包裹国家,地区,城市,性别,眼睛颜色,等等.完整必须支持上面这些特征的各种组合来搜索用户, ...
- linux 目录说明
1./bin /usr/bin /usr/local/bin 都是放置用户可执行二进制文件. 2./boot 主要是放置liunx系统启动时用到的文件. 2./dev 文件夹内主要是西东外设 ...
- Oracle错误问题---- 《ora-12638:身份证明检索失败》
使用客户端可以连接,但只有一个站点出现此问题,非常郁闷,网上查了一下,发现是用户认证问题,解决办法如下: 在ORACLE客户端目录下 NETWORK/ADMIN下的sqlnet.ora,使用记事本打开 ...
- Win7下Solr4.10.1和TomCat8的安装
1.系统为win7 64位系统,安装有wamp的环境,我的所有网站放在 d:\webserver下,域名指向该目录下的子目录: 2.安装TomCat8到 D:\Tomcat 8.0: 3.在 d:\w ...
- 【原创】用shell+ant构建apk
#!/bin/bash ######################################################################### ## $PRODVERSIO ...
- linux下定时任务
一.linux定时任务软件种类 .at : 适合执行一次的任务.突发性的任务.需要启动 atd 服务才能执行任务. .crontab: 周期性的执行任务工作:启动crond 服务后可以执行任务.最常用 ...
- javascript回调函数
function $$(f) { if (typeof f == 'function') {//f是一个函数 f(); } else { alert('not a function'); } } $$ ...