代码改变世界

Design Pattern 设计模式【观察者】

  Virus-BeautyCode  阅读(1739)  评论(2编辑  收藏  举报

  观察者设计模式中存在两种角色: 观察者被观察者

  最经典的例子就是“猫叫了,老鼠跑了,惊醒了主人。”,这个例子也是我以前去微软面试的时候碰到的一个面试题,当时就是让我设计一下这个过程的实现框架。

  在这个例子中,老鼠和主人其实就是观察者,而猫属于被观察者,老鼠和主人观察猫的变化,猫有了动作,老鼠和主人就要做出响应。被观察者,就是这个过程,也可以叫做整个事件的根本原因,亦可以叫直接导火索。 

  从上面这个例子不难看出,观察者和被观察者的关系通常是n:1,也就是多个多个观察者观察一个被观察者。 

  这样就给我们一个小小的提示,通过这个提示就可以很容易的找出被观察者。猫,也就是观察的内容,或者观察的被动者,猫所在的角色就是被观察者;老鼠和主人,也就是观察的主体,动作的出发者,他们的角色就是观察者。

  当然了,实际的项目中,这个过程肯定没有这么简单,这时候需要我们把大过程,分解成很多的小过程,分层级的找出观察者和被观察者,分层级的使用观察者模式。

  下面给出我写的一个完整代码,欢迎大家一起讨论。

      完整代码:/Files/virusswb/BeautyCode.DesignPattern.Observer.rar

  代码包括两个部分,首先是普通的观察者模式,也就是在被观察者中注册观察者,多个观察者通过一个荣起来管理,然后向观察者发送通知。

   

普通的观察者模式

 

  第二种是在.NET 框架的基础之上的观察者,也就是事件委托类型的观察者,不需要在被观察者中注册观察者,降低了观察者和被观察者的耦合度。

 

以事件委托为基础的观察者模式

 

 

  下面是他们的调用代码,是一个Console应用程序

 

Observer 代码调用

 

 

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2008-11-26 开发sharepoint工作流过程中的Ptifall(容易犯的错误)
2008-11-26 宿主和工作流:两个世界的交互 4(Host给工作流传递数据)
点击右上角即可分享
微信分享提示