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 ...
随机推荐
- HTTPS 部署简要指南
许多Web开发者都知道SSL,但常见的情况是SSL没有完整地部署或者没有部署在它应该部署的地方.这篇关于何时及如何部署SSL的简要指南,将帮助你避免大多数常见错误. 要点 如果你有任何机密信息,或者你 ...
- (转)ASP.NET里面简单的记住用户名和密码
using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using S ...
- handler更新UI主线程
示例:下面代码的功能是修改UI主线程TextView的内容 public class MainActivity extends Activity { private Button btn_start; ...
- 在birt中解决引用了不存在的绑定出现的问题
在birt中常出现这个错误,xxx引用了不存在的绑定. 当你选中整个表,然后在下方属性编辑器旁边的绑定中可以看到绑定的字段.不需要的就可以删掉.也可以进行编辑. 想对查出来的数据加条件.可以选中数据明 ...
- TreeView 数据绑定及选中命令处理
昨天接近下班,一个群里面的网友,问treeView绑定后 选中命令怎么来处理,怎么没有效果,而且用MVVM的方式来写:快下班了本来想远程帮他看下,结果就说写个Demo给他看:再加上选中传参: 下面分 ...
- ios视图切换之push与present混用
在变成过程中,经常遇到两个视图控制器之间的切换,导航控制器即UINaVigation是最常用的一种,有时为了某些效果又需要进行模态切换,即present. 我们的布局经常是在window上加一个nav ...
- asp.net 防止页面刷新或后退引起重复提交
项目中经常遇到刷新后重复的向数据库增加一条相同的记录,造成数据重复,如何规避这些问题呢?下面我们就一起讨论一下在asp.net怎样防止页面刷新或后退引起重复提交数据的问题: 其实asp.net防止刷 ...
- easyui最小化后停留在页面的右下角
0.此方法没有什么技术含量,纯属于自己瞎想的!如果有的好方法,请留言告之谢谢!! 1.直接上代码: $('#winId').window({ onMinimize: function () { //最 ...
- DotNET知识点总结五(笔记整合)
1.委托:通常指的是 多播委托 通常的说,委托就是一个存放方法指针的容器,是一个安全的函数指针,供程序员安全调用.委托的本质就是一个类,继承于MulticastDelegate——>Delega ...
- win7 64位 python3.4&opencv3.0配置安装
参考:http://blog.csdn.net/sun7_she/article/details/50051249 一.安装Python 下载Python3.4.2 网址:https://www.py ...