C#观察者设计模式


本文提供全流程,中文翻译。

Chinar 坚持将简单的生活方式,带给世人!

(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)


Chinar —— 心分享、心创新!

助力快速理解 观察者设计模式

为新手节省宝贵的时间,避免采坑!

Chinar 教程效果:

刑警警察叔叔注视了一下四周
穿黑色衣服的:神偷 - 跑了
穿白色衣服的:笨贼 - 跑了
穿平常色衣服的:平民 - 跑了
穿红色衣服的:强盗 - 跑了


全文高清图片,点击即可放大观看 (很多人竟然不知道)


1

Police —— 警察类

这个类用来表示警察

当警察看向四周的时候,所有事件下的订阅者,都会被调用到

也可以理解为广播:当警察看向四周,所有小偷都接收到了广播

    /// <summary>
/// 警察类
/// </summary>
class Police
{
private string type; //类型
private string name; //名称
public event Action PoliceLook; //委托+event变事件 /// <summary>
/// 构造函数
/// </summary>
/// <param name="type">类型</param>
/// <param name="name">名称</param>
public Police(string type, string name)
{
this.type = type;
this.name = name;
} /// <summary>
/// 注视
/// </summary>
public void LookAt()
{
Console.WriteLine(type + name + "注视了一下四周");
if (PoliceLook != null)
{
//外部调用LookAt后,当警察注视周围的时候。会调用事件对象中,所有订阅的用户(也就是所有小偷,因为所有小偷都订阅了)
PoliceLook();
}
} //区别:
//1.事件不能在类的外部,通过类对象调用;事件提供广播,订阅
//2.委托可以,在内外调用
//3.事件表达外发的接口、委托常用回调函数
//

2

Thief —— 小偷

这个类用来表示小偷,具备基本属性名字、颜色、逃跑功能

那什么时候逃跑呢??就是当警察看向四周的时候逃跑

就是让所有小偷、订阅警察看向四周的事件,从而达到设计目的

    /// <summary>
/// 小偷类
/// </summary>
class Thief
{
private string name; //名字
private string color; //衣服颜色 /// <summary>
/// 构造
/// </summary>
/// <param name="name">小偷名</param>
/// <param name="color">衣服颜色</param>
/// <param name="police">警察</param>
public Thief(string name, string color, Police police)
{
this.name = name;
this.color = color;
police.PoliceLook += Run; //把自身的逃跑方法,注册/订阅 警察类的事件对象中。一旦警察有Look这个动作,Run方法就会执行
} /// <summary>
/// 小偷逃跑打印方法
/// </summary>
public void Run()
{
Console.WriteLine("穿" + color + "衣服的:" + name + " - 跑了");
}
}

3

Main —— 主入口

这个类用来测试、打印输出结果

直观的表示事件变动

这个观察者设计模式很简单,直观的即可明白事件、委托是怎样传递信息的

/// <summary>
/// 测试类——用来输出结果
/// </summary>
class Program
{
/// <summary>
/// 程序主入口
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Police police = new Police("刑警", "警察叔叔");
Thief thief1 = new Thief("神偷", "黑色", police);
Thief thief2 = new Thief("笨贼", "白色", police);
Thief thief3 = new Thief("平民", "平常色", police);
Thief thief4 = new Thief("强盗", "红色", police); //police.PoliceLook += thief1.Run;//这种方法没有上边直接构造简单,目的都一样
//police.PoliceLook += thief2.Run;
//police.PoliceLook += thief4.Run; police.LookAt(); //当警察对象有所动作的时候,所以订阅了的小偷。都会被传达信息,从而调用事件中封装的所有订阅者函数
Console.ReadLine();
}
}

4

Console —— 控制台输出

F5控制台输出结果

会发现,只有当 police.LookAt() 被调用的时候,小偷才跑

否则,小偷都没有任何动作

简单的一个小例子,可直观的看出事件/委托是如何传递不同类之间的调用关系

刑警警察叔叔注视了一下四周
穿黑色衣服的:神偷 - 跑了
穿白色衣服的:笨贼 - 跑了
穿平常色衣服的:平民 - 跑了
穿红色衣服的:强盗 - 跑了

支持

May Be —— 搞开发,总有一天要做的事!

拥有自己的服务器,无需再找攻略!

Chinar 提供一站式教程,闭眼式创建!

为新手节省宝贵时间,避免采坑!

先点击领取 —— 阿里全产品优惠券 (享受最低优惠)



1 —— 云服务器超全购买流程 (新手必备!)



2 —— 阿里ECS云服务器自定义配置 - 购买教程(新手必备!)



3—— Windows 服务器配置、运行、建站一条龙 !



4 —— Linux 服务器配置、运行、建站一条龙 !




" role="presentation">

Chinar


END

本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究


对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com


对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址

Unity 3D观察者设计模式-C#委托和事件的运用的更多相关文章

  1. C#委托与事件之观察者Observer设计模式

    前言    委托: 委托是一种在对象里保存方法引用的类型,同时也是一种类型安全的函数指针. 或委托可以看成一种表示函数的数据类型,类似函数指针. 事件是特殊的委托 观察者模式:两种角色:(1)Subj ...

  2. 观察者设计模式(C#委托和事件的使用)

    观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新.在现实生活中的可见观察者模式,例如,微信中的订阅号,订阅博客和QQ微博中关注好友 ...

  3. 转载:C#中委托、事件与Observer设计模式

    原文地址 http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx 感谢博主分享! 范例说明 假设 ...

  4. Unity 3D委托entrust

    Unity 3D委托的多种用法 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...

  5. 委托、事件与Observer设计模式

    范例说明 上面的例子已不足以再进行下面的讲解了,我们来看一个新的范例,因为之前已经介绍了很多的内容,所以本节的进度会稍微快一些: 假设我们有个高档的热水器,我们给它通上电,当水温超过95度的时候:1. ...

  6. Unity 3d 脚本常用事件

    1.学习笔记,每天晚上看看unity 3d 的教程 学点东西,先上一张图 这是 系统中脚本执行的顺序图 Awake()在MonoBehavior创建后就立刻调用,在脚本实例的整个生命周期中,Awake ...

  7. Java事件监听机制与观察者设计模式

    一. Java事件监听机制 1. 事件监听三要素: 事件源,事件对象,事件监听器 2. 三要素之间的关系:事件源注册事件监听器后,当事件源上发生某个动作时,事件源就会调用事件监听的一个方法,并将事件对 ...

  8. unity 3D物体使用EventSystem响应事件

    在ugui中创建一个canvas 之后会自动创建一个EventSystem,用来处理UI上的时间响应.(可以通过UI>EventSystem创建EventSystem) EventSystem ...

  9. Unity 3D Framework Designing(6)——设计动态数据集合ObservableList

    什么是 『动态数据集合』 ?简而言之,就是当集合添加.删除项目或者重置时,能提供一种通知机制,告诉UI动态更新界面.有经验的程序员脑海里迸出的第一个词就是 ObservableCollection.没 ...

随机推荐

  1. Spring循环依赖

    Spring-bean的循环依赖以及解决方式 Spring里面Bean的生命周期和循环依赖问题 什么是循环依赖? 循环依赖其实就是循环引用,也就是两个或者两个以上的bean互相持有对方,最终形成闭环. ...

  2. drozer安装使用教程(Windows)

    drozer和adb一样,又不是新出的工具,本不该出了这么久还要由我这样半懂不懂的再写篇东西了.但是还是一样每次使用都得百度和筛选半天,所以记下来算给自己看.以后看到我还写些老掉牙的东西都是这个原因, ...

  3. rexec/rlogin/rsh介绍

    服务 是否需要密码 是否明文 功能 端口 rexec 是 是 远程执行命令 512 rlogin 是 是 远程登录得到shell 513 rsh 是 是 可远程执行命令,也可远程登录得到shell 5 ...

  4. Spring AOP+Log4j记录项目日志

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6567672.html 项目日志记录是项目开发.运营必不可少的内容,有了它可以对系统有整体的把控,出现任何问题 ...

  5. 使用javassist进行动态编程

    今天在研究dubbo时,发现一个新的知识点,可以使用javassist包进行动态编程,hibernate也使用该包进行编程.晚上百度了很多资料,将它的特性以代码的形式展现出来. package com ...

  6. js--事件冒泡-捕获

    什么是事件流: 事件流描述的是从页面中接受事件的顺序,但有意思的是,微软(IE)和网景(Netscape)开发团队居然提出了两个截然相反的事件流概念, IE的事件流是事件冒泡流(event bubbl ...

  7. linux网络操作 ifconfig命令

    ifconfig 查看已经被激活的网卡详细信息 "ifconfig eth0" 查看特定的网卡信息 [root@ssgao ~]# ifconfig eth0 eth0 Link ...

  8. 【原创】<Debug> not positioned on a valid record

    [Problem] QSqlQuery::value: not positioned on a valid record QSqlQuery :: value:未定位在有效记录上 [Solution] ...

  9. java中方法内可以调用同一个类中的方法

    在同一个类中,java的普通方法的相互调用,可以使用this+点号+方法名,也可省略this+点号,java编 译器会自动补上.

  10. 谈谈你对Java面向对象的理解

    面向对象,其实是一种思考的思想,是一种思想,而这种思想它早期的思想是面向过程,通过不断的演化变成了现在的面向对象,思想有一个演变形式,早期是面向过程,现在是面向对象. 故事:把大象放进冰箱里,分几步? ...