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. ScheduledThreadPoolExecutor

    java提供了方便的定时器功能,代码示例: public class ScheduledThreadPool_Test { static class Command implements Runnab ...

  2. 蓝桥杯—ALGO-2 最小最大公倍数

    问题描述已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少. 输入格式输入一个正整数N. 输出格式输出一个整数,表示你找到的最小公倍数.样例输入9样例输出504数据规模与约定1 ...

  3. windows 路由的配置

    查看ip路由表 route print : netstat -r windows 下添加一条路由 route命令 route [-f][-p][command [distinataion] [MASK ...

  4. Linux command stty

    Linux command stty reference: https://blog.csdn.net/lqxandroid2012/article/details/78929506 [Purpose ...

  5. unity中手机触摸代码

    #elif UNITY_IOS || UNITY_ANDROID         if(Input.touchCount <= 0)         {             return;/ ...

  6. [转载]mysqlcreate新建用户host使用%,本地无法连接原因及解决方法

    转载自 http://www.2cto.com/database/201307/225781.html mysql,因为root权限过高,所以新建一用户appadmin,权限仅为要用到的数据库.创建语 ...

  7. hMailServer 配置

    本例记录如何通过  [hMailServer] 在私有服务器中搭建邮件服务器 1.下载安装包 版本: hMailServer-5.6.7-B2425.exe (支持使用内置数据库) , 安装时,设置管 ...

  8. MyEclipse复制js文件乱码

    MyEclipse复制js文件乱码 右击js文件:

  9. 从R-CNN到FAST-RCNN再到Faster R-CNN

    (Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks)   R-CNN: (1)输入测试图像: ...

  10. 打开和写入word文档

    一. 使用win32读取word内容 # -*- coding: utf-8 -*- from win32com import client as wc def readDocx2(): word = ...