本文文字内容均选自《大话设计模式》一书。

解释:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

此模式又叫发布-订阅模式。

举例:火车到站与乘客下车。

主题:

 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中的委托与事件的更多相关文章

  1. 事件和委托: 第 6 页 .Net Framework中的委托与事件

    原文发布时间为:2008-11-01 -- 来源于本人的百度文章 [由搬家工具导入] .Net Framework中的委托与事件 尽管上面的范例很好地完成了我们想要完成的工作,但是我们不仅疑惑:为什么 ...

  2. [转]C# 中的委托和事件 + 观察者模式

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

  3. C# 中的委托和事件

    觉得这篇文章写的非常好,大神之作,由简入繁,对我这种初学者来说帮忙很大,特此留存下. 摘自:http://tracefact.net/CSharp-Programming/Delegates-and- ...

  4. C# 中的委托和事件(转)

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

  5. C# 中的委托和事件(转载)

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

  6. 【转】C# 中的委托和事件

    阅读目录 C# 中的委托和事件 引言 将方法作为方法的参数 将方法绑定到委托 事件的由来 事件和委托的编译代码 委托.事件与Observer设计模式 .Net Framework中的委托与事件 总结 ...

  7. c#中的委托和事件(转)

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

  8. C#中的委托、事件和设计模式(转载)

    引言 委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人 ...

  9. 转载 -- C# 中的委托和事件

    原文地址:http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx C# 中的委托和事件 引言 委 ...

随机推荐

  1. Android Gradle基于参数化配置实现差异化构建

    一.背景: 项目中有一些特殊的需求,如个别渠道集成腾讯bugly,个别渠道集成易观统计,不同的渠道集成不同的推送策略(如Oppo渠道优先Opush推送),不同的渠道拥有不同的第三方登录集成等等.这些需 ...

  2. sun.misc.Unsafe 详解

    原文地址 译者:许巧辉 校对:梁海舰 Java是一门安全的编程语言,防止程序员犯很多愚蠢的错误,它们大部分是基于内存管理的.但是,有一种方式可以有意的执行一些不安全.容易犯错的操作,那就是使用Unsa ...

  3. Python全国二级等级考试(2019)

    一.前言 2018年9月随着全国计算机等级考试科目中加入“二级Python”,也确立了Python在国内的地位,猪哥相信Python语言势必会像PS那般普及.不久的将来,谁会Python谁就能获得女神 ...

  4. Kubernetes Ingress Controller的使用及高可用落地

    Kubernetes Ingress Controller的使用及高可用落地 看懂本文要具备一下知识点: Service实现原理和会应用 知道反向代理原理,了解nginx和apache的vhost概念 ...

  5. Nginx的“远方表哥”—Tengine

    本文收录在Linux运维企业架构实战系列 今天想起当初研究nginx反向代理负载均衡时,nginx自身的upstream后端配置用着非常不舒服: 当时使用的淘宝基于nginx二次开发的Tengine, ...

  6. OAuth2.0记录

    阮一峰老师讲解OAuth2.0 http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 举例详解: https://www.cnblogs.com/ ...

  7. 将一个html文件引入另一个html文件的div中

    width="" height=""属性可根据要求自己设定

  8. Dynamics 365中自定义工作流活动更新了输入输出参数后获取的方法

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复245或者20170309可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  9. 你在为谁工作——IT帮深圳分站2019年3月线下活动回顾

    对于工作,在每个人的心中,它所占的份量都是不一样的.有的人活着是为了工作,有的人工作是为了更好的生活. 在3月24日下午,北京.上海与深圳三地我们同步举办了关于工作这个话题的沙龙活动. 我们深圳分站参 ...

  10. July 04th. 2018, Week 27th. Wednesday

    And if you really want to see what people are, all you have to do is to look. 想真正了解他人,只需要用心看. From W ...