- 浏览: 188704 次
- 性别:
- 来自: 深圳
文章分类
最新评论
上面的例子已不足以再进行下面的讲解了,我们来看一个新的范例,因为之前已经介绍了很多的内容,所以本节的进度会稍微快一些:
假设我们有个高档的热水器,我们给它通上电,当水温超过95度的时候:1、扬声器会开始发出语音,告诉你水的温度;2、液晶屏也会改变水温的显示,来提示水已经快烧开了。
现在我们需要写个程序来模拟这个烧水的过程,我们将定义一个类来代表热水器,我们管它叫:Heater,它有代表水温的字段,叫做temperature;当然,还有必不可少的给水加热方法BoilWater(),一个发出语音警报的方法MakeAlert(),一个显示水温的方法,ShowMsg()。
Observer设计模式简介
上面的例子显然能完成我们之前描述的工作,但是却并不够好。现在假设热水器由三部分组成:热水器、警报器、显示器,它们来自于不同厂商并进行了组装。那么,应该是热水器仅仅负责烧水,它不能发出警报也不能显示水温;在水烧开时由警报器发出警报、显示器显示提示和水温。
这时候,上面的例子就应该变成这个样子:
这里就出现了一个问题:如何在水烧开的时候通知报警器和显示器?在继续进行之前,我们先了解一下Observer设计模式,Observer设计模式中主要包括如下两类对象:
- Subject:监视对象,它往往包含着其他对象所感兴趣的内容。在本范例中,热水器就是一个监视对象,它包含的其他对象所感兴趣的内容,就是temprature字段,当这个字段的值快到100时,会不断把数据发给监视它的对象。
- Observer:监视者,它监视Subject,当Subject中的某件事发生的时候,会告知Observer,而Observer则会采取相应的行动。在本范例中,Observer有警报器和显示器,它们采取的行动分别是发出警报和显示水温。
在本例中,事情发生的顺序应该是这样的:
- 警报器和显示器告诉热水器,它对它的温度比较感兴趣(注册)。
- 热水器知道后保留对警报器和显示器的引用。
- 热水器进行烧水这一动作,当水温超过95度时,通过对警报器和显示器的引用,自动调用警报器的MakeAlert()方法、显示器的ShowMsg()方法。
类似这样的例子是很多的,GOF对它进行了抽象,称为Observer设计模式:Observer设计模式是为了定义对象间的一种一对多的依赖关系,以便于当一个对象的状态改变时,其他依赖于它的对象会被自动告知并更新。Observer模式是一种松耦合的设计模式。
实现范例的Observer设计模式
我们之前已经对委托和事件介绍很多了,现在写代码应该很容易了,现在在这里直接给出代码,并在注释中加以说明。
using System;
using System.Collections.Generic;
using System.Text;
namespace Delegate {
// 热水器
public class Heater {
private int temperature;
public delegate void BoilHandler(int param); //声明委托
public event BoilHandler BoilEvent; //声明事件
// 烧水
public void BoilWater() {
for (int i = 0; i <= 100; i++) {
temperature = i;
if (temperature > 95) {
if (BoilEvent != null) { //如果有对象注册
BoilEvent(temperature); //调用所有注册对象的方法
}
}
}
}
}
// 警报器
public class Alarm {
public void MakeAlert(int param) {
Console.WriteLine("Alarm:嘀嘀嘀,水已经 {0} 度了:", param);
}
}
// 显示器
public class Display {
public static void ShowMsg(int param) { //静态方法
Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", param);
}
}
class Program {
static void Main() {
Heater heater = new Heater();
Alarm alarm = new Alarm();
heater.BoilEvent += alarm.MakeAlert; //注册方法
heater.BoilEvent += (new Alarm()).MakeAlert; //给匿名对象注册方法
heater.BoilEvent += Display.ShowMsg; //注册静态方法
heater.BoilWater(); //烧水,会自动调用注册过对象的方法
}
}
}
输出为:
Alarm:嘀嘀嘀,水已经 96 度了:
Alarm:嘀嘀嘀,水已经 96 度了:
Display:水快烧开了,当前温度:96度。
// 省略...
// 热水器
public class Heater {
private int temperature;
// 烧水
private void BoilWater() {
for (int i = 0; i <= 100; i++) {
temperature = i;
}
}
}
// 警报器
public class Alarm{
private void MakeAlert(int param) {
Console.WriteLine("Alarm:嘀嘀嘀,水已经 {0} 度了:" , param);
}
}
// 显示器
public class Display{
private void ShowMsg(int param) {
Console.WriteLine("Display:水已烧开,当前温度:{0}度。" , param);
}
}
namespace Delegate {
class Heater {
private int temperature; // 水温
// 烧水
public void BoilWater() {
for (int i = 0; i <= 100; i++) {
temperature = i;
if (temperature > 95) {
MakeAlert(temperature);
ShowMsg(temperature);
}
}
}
// 发出语音警报
private void MakeAlert(int param) {
Console.WriteLine("Alarm:嘀嘀嘀,水已经 {0} 度了:" , param);
}
// 显示水温
private void ShowMsg(int param) {
Console.WriteLine("Display:水快开了,当前温度:{0}度。" , param);
}
}
class Program {
static void Main() {
Heater ht = new Heater();
ht.BoilWater();
}
}
}
发表评论
文章已被作者锁定,不允许评论。
-
使用SignalR构建一个最基本的web聊天室
2015-01-06 15:09 761使用SignalR,可以使用服务器消息推送到客户端,件demo ... -
Cookie小知识
2014-12-17 11:02 595如果cookie设置了过期时间,cookie就会保存在硬盘中 ... -
远程服务器返回错误: (500) 内部服务器错误 (解决方案)
2013-12-19 18:00 14170“/”应用程序中的服务器错误。 远程服务器返回错误: ... -
C# 的异步get 的三种方法
2013-06-21 16:04 958using System;using System.Colle ... -
ado.net 连接池相关知识
2013-01-27 20:07 834using System;using System.Coll ... -
c# 验证码生成与使用
2012-10-07 14:37 903---生成验证码的类 using System;using ... -
多线程的理解
2012-09-21 00:31 715什么是多线程:多线程就是“同时”可以执行多个任务,实际上并不是 ... -
委托:将方法绑定到委托
2012-09-20 22:59 798将方法绑定到委托 看到这里,是不是有那么点如梦初醒的感觉?于 ... -
委托:将方法做为方法的参数
2012-09-20 22:51 728引言 委托 和 事件在 .Net Framework中的应用 ... -
C#,FTP上传的代码 FtpWebRequest
2012-08-24 22:46 960private void Upload(string file ... -
c#之冒泡法与快速法排序
2012-08-08 22:10 739设计页面labe1 ,label2 ,label5分 ... -
C#中数组类型的相互转换
2012-08-08 22:11 1534string数组类型转换为int数组.方法一:Con ... -
C#中基类和派生类的构造函数以及变量的执行顺序整理
2012-04-04 22:54 1096Code highlighting produced by A ... -
时间处理类
2012-03-01 11:10 724/// <summary> /// ... -
DropDownList 小知识
2011-12-03 10:24 850给DropDownList 绑定值后,如果要默认选中其中一个 ... -
列表最后一行加小计或总计 ——小总结
2011-11-30 16:56 17661.所有分页的总计 protec ... -
无法加载协定为“tt.WeatherWebServiceSoap”的终结点配置部分,因为找到了该协定的多个终结点配置。请按名称指示首选的终结点配置部分。
2011-11-22 22:08 3822无法加载协定为“tt.WeatherWebServiceSoa ... -
一个天气预报的webservice
2011-11-21 20:45 1041http://www.webxml.com.cn/WebSer ... -
asp.net 页面生成html页面 方法二
2011-11-15 22:53 976protected override void Render ... -
asp.net 页面生成html页面 方法一
2011-11-15 22:43 864这是个方法 private bool CreateList( ...
相关推荐
委托、事件和Observer设计模式是面向对象编程中的关键概念,特别是在C#中有着广泛的应用。本文将深入探讨这三个概念,并通过实例帮助初学者理解和掌握它们。 首先,让我们从委托(Delegate)开始。委托在C#中可以被...
### 详解C#委托,事件,Observer设计模式 在C#编程中,了解并掌握委托、事件以及Observer设计模式对于构建高效、灵活的应用程序至关重要。本文将深入探讨这些概念,并通过具体的示例来帮助理解。 #### 1. 将方法...
在C#编程语言中,委托、事件和Observer设计模式是构建高效、可扩展的应用程序的重要概念。这篇文档将深入探讨这些主题,以帮助你更好地理解它们的用途和实现方式。 首先,我们来看委托(Delegate)。委托在C#中相当...
C#中的委托与事件讲透读书笔记学习心得 在C#中,委托和事件是两个非常重要的概念,它们在.NET Framework中的应用非常广泛。然而,对于很多初学者来说,理解委托和事件并不是一件容易的事情。它们就像是一道槛儿,过...
在编程领域,观察者模式(Observer Pattern)和事件委托(Event Delegation)是两种常见的设计模式,它们在处理对象间的交互和通信时起到关键作用。本文将深入探讨这两种模式的概念、工作原理及其在Java中的应用。 ...
下面我们将深入讲解委托的定义、使用委托的原因、事件的由来、委托和事件对 Observer 设计模式的意义、.Net Framework 中的委托和事件。 委托的定义 委托是一个类型,可以将方法作为参数传递给它,然后在后续使用时...
Observer模式是一种设计模式,主要目的是实现对象之间的松耦合,使得当一个对象的状态发生改变时,依赖于这个对象状态的其他对象能够得到通知并自动更新。在这个“重温Observer模式--热水器·改”的讨论中,作者将...
委托和事件在.NET框架中的应用不仅仅局限于方法的参数传递或状态的广播,它们还是实现设计模式,尤其是观察者模式的关键。在观察者模式中,一个对象(观察者)订阅另一个对象(主题)的状态变化,并在状态变化发生时...
委托 和 事件在 .Net ...本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。
3. 设计模式:如观察者模式(Observer Pattern)中,订阅者通过事件接收发布者的通知。 4. 架构设计:在事件总线(Event Bus)中,系统组件之间通过事件进行通信,减少直接依赖。 总结,委托和事件是.NET中实现...
委托 和 事件在 .Net Framework中的应用...本文中,将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。
在C#编程中,委托和事件是两种非常重要的特性,它们是实现面向对象设计的关键工具,尤其是对于构建异步应用程序。下面将详细讲解这两个概念及其在异步编程中的应用。 一、委托 委托在C#中可以被视为一种类型,它...
委托 和 事件在 .Net ...本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。
在C#中,委托可以用于实现Observer设计模式,从而使得代码更加灵活和可扩展。 委托和事件是C#中的重要概念,广泛应用于各个领域。通过了解委托和事件的概念、应用场景和设计模式,可以提高开发效率和代码质量。
##### 2.4.4 .Net框架中的委托与事件 .NET框架提供了许多内置的委托和事件类型,这些类型通常用于各种场景。例如,`EventHandler`委托和`EventArgs`类是.NET框架中最常用的事件处理机制之一。 **示例:** 1. **...
观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以用于在对象事件发生时通知多个“观察”该对象的其他对象。这种模式的核心在于解耦,让被观察的对象与观察者之间实现松散耦合。 ...