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. 牛客网 PAT 算法历年真题 1009 : 1019. 数字黑洞 (20)

    1019. 数字黑洞 (20) 时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小) 题目描述 给定任一个各位数字不完全相同的4 ...

  2. 一篇文章有若干行,以空行作为输入结束的条件。统计一篇文章中单词the(不管大小写,单词the是由空格隔开的)的个数。

    #include <iostream>using namespace std; int k = 0;int n = 0;int main() { char c; char a[1000]; ...

  3. learning at command AT+CSUB

    [Purpose] Learning how to get mobile module info [Eevironment] Shell terminal, base on gcom command ...

  4. java③

    1.变量是什么? 变量====>一个数据在内存中 存储空间的表示! 在程序运行期间可以发生变化! *变量名 可以 迅速的从内存中 查询出 指定的变量! 2.数据类型: 数据类型 一共分为两种: ...

  5. git-github-TortoiseGit综合使用教程(二)快速入门

    :建立版本库 在github网站上创建一个版本库,并复制clone地址. git@github.com:jackadam1981/Flask_Base.git https://github.com/j ...

  6. C++基础知识:构造与析构

    1.构造函数的定义: C++中的类可以定义与类名相同的特殊成员函数这种与类名相同的成员函数叫做构造函数构造函数在定义时可以有参数,但是没有任何返回类型的声明 2.构造函数的调用: 一般情况下C++编译 ...

  7. 浅议APC

    0x01  APC中断请求级别   在Intel x86体系结构中,外部硬件中断是通过处理器上的"中断管脚"或者一个称为"本地APIC(local APIC)" ...

  8. 数字签名-MD5

    MD5是信息摘要的意思,报文产生摘要是唯一的(1:1),而且是单向的(通过摘要反推不出源报文) java中的java.security.MessageDigest类,参考MessageDigest的功 ...

  9. FindResource () RT_HTML 为什么总是出错呢 ?

    #include <windows.h> #include <commdlg.h> #include <ole2.h> BOOL GetHtmlResource(L ...

  10. 牛客oi测试赛 二 B 路径数量

    题目描述 给出一个 n * n 的邻接矩阵A. A是一个01矩阵 . A[i][j]=1表示i号点和j号点之间有长度为1的边直接相连. 求出从 1 号点 到 n 号点长度为k的路径的数目. 输入描述: ...