观察者模式与.Net Framework中的委托与事件
本文文字内容均选自《大话设计模式》一书。
解释:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
此模式又叫发布-订阅模式。
举例:火车到站与乘客下车。
主题:
using System;
using System.Threading; namespace DelegateDemo2
{
public class 高速列车
{
public string 车次 { get; set; }
private string[] 途经车站;
private string 当前到站; public delegate void 到站EventHandler(Object sender, 到站EventArgs e);
public event 到站EventHandler 到站; public class 到站EventArgs : EventArgs
{
public readonly string 当前到站;
public 到站EventArgs(string 当前到站)
{
this.当前到站 = 当前到站;
}
} public 高速列车()
{
this.车次 = "G253";
this.途经车站 = new string[] { "青岛站", "济南站", "泰安站", "徐州站", "南京站", "苏州站", "杭州站" };
} protected void On到站(到站EventArgs e)
{
if (this.到站 != null)
{
this.到站(this, e);
}
} public void 行驶()
{
for (int i = ; i < this.途经车站.Length; i++)
{
this.当前到站 = this.途经车站[i];
到站EventArgs e = new 到站EventArgs(this.当前到站);
On到站(e); Thread.Sleep( * );
}
}
}
}
观察者1:
using System; namespace DelegateDemo2
{
public class 显示器
{
public void 显示到站信息(Object sender, DelegateDemo2.高速列车.到站EventArgs e)
{
高速列车 高速列车 = (高速列车)sender;
Console.WriteLine("{0}次列车当前已到达{1}。", 高速列车.车次, e.当前到站);
}
}
}
观察者2:
using System; namespace DelegateDemo2
{
public class 乘客
{
public string 姓名 { get; set; }
public string 目的地 { get; set; } public 乘客(string 姓名, string 目的地)
{
this.姓名 = 姓名;
this.目的地 = 目的地;
} public void 提行李下车(Object sender, DelegateDemo2.高速列车.到站EventArgs e)
{
if (e.当前到站 == this.目的地)
{
Console.WriteLine("乘客({0})已到达目的地{1},提行李下车!", this.姓名, e.当前到站);
}
}
}
}
客户端:
namespace DelegateDemo2
{
class Program
{
static void Main(string[] args)
{
高速列车 高速列车 = new 高速列车();
显示器 显示器 = new 显示器(); 乘客 张三丰 = new 乘客("张三丰", "济南站");
乘客 风清扬 = new 乘客("风清扬", "南京站");
乘客 扫地僧 = new 乘客("扫地僧", "杭州站"); 高速列车.到站 += new 高速列车.到站EventHandler(显示器.显示到站信息);
高速列车.到站 += new DelegateDemo2.高速列车.到站EventHandler(张三丰.提行李下车);
高速列车.到站 += new DelegateDemo2.高速列车.到站EventHandler(风清扬.提行李下车);
高速列车.到站 += new DelegateDemo2.高速列车.到站EventHandler(扫地僧.提行李下车); 高速列车.行驶();
}
}
}
使用情景:当一个对象的改变需要同时改变其他对象,且不知道具体有多少对象有待改变时,应该考虑使用观察者模式。
【委托】:委托可以看作是对函数的抽象,是函数的“类”,委托的实例将代表一个具体的函数。
一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值。
而且,一个委托可以搭载多个方法,所有方法被依次唤起。更重要的是,它可以使得委托对象所搭载的方法并不需要属于同一个类。
观察者模式与.Net Framework中的委托与事件的更多相关文章
- 事件和委托: 第 6 页 .Net Framework中的委托与事件
原文发布时间为:2008-11-01 -- 来源于本人的百度文章 [由搬家工具导入] .Net Framework中的委托与事件 尽管上面的范例很好地完成了我们想要完成的工作,但是我们不仅疑惑:为什么 ...
- [转]C# 中的委托和事件 + 观察者模式
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
- C# 中的委托和事件
觉得这篇文章写的非常好,大神之作,由简入繁,对我这种初学者来说帮忙很大,特此留存下. 摘自:http://tracefact.net/CSharp-Programming/Delegates-and- ...
- C# 中的委托和事件(转)
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
- C# 中的委托和事件(转载)
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
- 【转】C# 中的委托和事件
阅读目录 C# 中的委托和事件 引言 将方法作为方法的参数 将方法绑定到委托 事件的由来 事件和委托的编译代码 委托.事件与Observer设计模式 .Net Framework中的委托与事件 总结 ...
- c#中的委托和事件(转)
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
- C#中的委托、事件和设计模式(转载)
引言 委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人 ...
- 转载 -- C# 中的委托和事件
原文地址:http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx C# 中的委托和事件 引言 委 ...
随机推荐
- 从mysql中拿到的数据构造为列表
最近测试接口遇到一个问题,用python2.7从mysql中取到的数据是元祖类型的,元祖内部的元素也是一个元祖(并且部分元素的编码格式是unicode的): 类似这样: ((10144, u''), ...
- 性能测试工具Locust的使用
一.写在前面 官网:https://www.locust.io/ 官方使用文档:https://docs.locust.io/en/latest/ 大并发量测试时,建议在linux系统下进行. 二.L ...
- Windows下安装tesserocr
很难受,由于这两天重装了系统,又得重新配置环境了,而我在安装tesserocr的时候踩了一些坑,于是想写出来分享一下. 一.安装tesseract 要安装tesserocr,首先要下载tesserac ...
- Python3|ddt|unittest|浅议数据驱动测试
目录 1.DDT简介 2.data装饰器 3.unpack装饰器 4.file_data装饰器 5.总结 1.DDT简介 Data-Driven Tests(DDT)即数据驱动测试.它允许您通过不同的 ...
- POLARDB · 最佳实践 · POLARDB不得不知道的秘密(二)
前言 POLARDB For MySQL(下文简称POLARDB)目前是阿里云数据库团队主推的关系型数据库.线上已经有很多企业用户在使用并且稳定运行了很久.当然,由于POLARDB是为云上环境专门打造 ...
- Docker入门(三)使用Docker Compose
Compose介绍 Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排.Compose 是一个用户定义和运行多个容器的 Docker 应用程序.在 ...
- 涨姿势:抛弃字母、数字和下划线写SHELL
PHP中异或 (^) 的概念 <?php echo"A"^"?";?> <?php echo"A"^"?&quo ...
- 华为模拟器eNSP安装(最新)网络工程师必备!
电脑杂七杂八的东西太多了,于是今天把电脑重装系统了,正好重新安装一下华为模拟器eNSP,这个教程应该是最新的,因为eNSP版本更新以及华为官网页面的变化,有的小伙伴安装eNSP都下载不到安装包,接下来 ...
- python3第一天,随便写写
哈哈 我滴第一篇博客,不知道咋写,随意看了看别人的博客,我还是不知道咋写,既然是我的博客,那我就把它当随笔写了(这里就是添加随笔...) 也不知道自己说了啥,不过想到了一句话:日记都是写给别人看的.哈 ...
- Linux 桌面玩家指南:08. 使用 GCC 和 GNU Binutils 编写能在 x86 实模式运行的 16 位代码
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...