观察者模式与.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# 中的委托和事件 引言 委 ...
随机推荐
- STM32学习笔记(二):GPIO口工作原理
STM32每个IO口具有7个寄存器来控制,每个IO口都可以自由进行编程控制,我们编程实际上控制的是通过控制那7个寄存器来控制我们的IO口,我们可以通过编程控制IO口,把IO口配置成如下八种模式: 1. ...
- MongoDB面试题
1.什么是MongoDB MongoDB是一个文档数据库,提供好的性能,领先的非关系型数据库.采用BSON存储文档数据.BSON()是一种类json的一种二进制形式的存储格式,简称Binary JSO ...
- Gatling简单测试SpringBoot工程
前言 Gatling是一款基于Scala 开发的高性能服务器性能测试工具,它主要用于对服务器进行负载等测试,并分析和测量服务器的各种性能指标.目前仅支持http协议,可以用来测试web应用程序和RES ...
- 阿里云ECS云服务器的简单使用
随着云服务的推广与普及,越来越多的人开始接触到云服务器.然而有些人购买后却不知从何下手,今天就来看下阿里云服务器的使用吧! 一.购买完阿里云服务器后进入阿里云官网首页点击控制台 找到所购买的云产品项点 ...
- 5.App Inventor 2编程实例--指南针
本视频来自:https://www.17coding.net 的 国庆特辑——指南针 共3个视频. 注意: 项目名字要使用英文. 项目完成后可以选择“打包APK”—“ 打包APK并下载到电脑”,然后 ...
- 【Android】OkHttp3总结与封装
开始使用 在app目录下的build.gradle中添加依赖: implementation 'com.squareup.okhttp3:okhttp:3.13.1' implementation ' ...
- JDK中的Atomic包中的类及使用
引言 Java从JDK1.5开始提供了java.util.concurrent.atomic包,方便程序员在多线程环境下,无锁的进行原子操作.原子变量的底层使用了处理器提供的原子指令,但是不同的CPU ...
- Python:如何用一行代码获取上个月是几月
现在转一篇志军100发于公众号 Python之禅的文章: Python:如何用一行代码获取上个月是几月 抱歉我用了个有点标题党的标题,因为担心你错过了本文,但内容绝对干货,本文介绍的关于Python时 ...
- 距离度量以及python实现(一)
1. 欧氏距离(Euclidean Distance) 欧氏距离是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式. (1)二维平面上两点a(x1,y1)与b(x2,y2)间 ...
- Image和Base64互相转换
base64介绍: Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息.例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长 ...