C#观察者设计模式

Chinar
END
| 本文提供全流程,中文翻译。 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 服务器配置、运行、建站一条龙 !
Chinar
END
本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究
对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com
对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址
继续阅读与本文标签相同的文章
上一篇 :
Unity 3D接入ShareSDK流程2
下一篇 :
C#Lambda表达式详解
-
Unity调用Windows对话框保存时另存为弹框
2026-05-27栏目: 教程
-
Unity镜子效果的实现(无需镜子Shader)
2026-05-27栏目: 教程
-
Unity射线检测的用法总结
2026-05-27栏目: 教程
-
unity中实现简单对象池,附教程原理
2026-05-27栏目: 教程
-
Unity调用Window提示框Yes/No(英文提示窗)
2026-05-27栏目: 教程
