Publish/Subscribe(发布/订阅)设计模式(Observer模式)
Posted on 2009-03-07 15:17 Charles Chen 阅读(9143) 评论(0) 编辑 收藏 举报记得已经写过一篇关于(Observer模式), http://www.cnblogs.com/Charles2008/archive/2008/10/06/1305116.html
发布/订阅简称(Pub/Sub)模式,这种Pub/Sub设计模式是observer的一种变体。Observer模式在Design patterns用于:一个对象(Observer)观察者被注入到另一个对象(主题Subject),用于监听事件,观察者(Observer)暗中地反映(主题Subject)的变化。publish/subscribe模式在主体(subject)和观察者(observer)之间增加了一层间隔。 这个层移除了在观察者(observer)和主体(subject)之间的捆绑并且在这两之间建立一种松耦合的关系。
Pub模式主要是负责向外发送消息,Sub主要是订阅消息。主要用于“只负责传递消息,并不关心其他对象已经收到这个消息”.
下面是使用Pub/Sub这种设计模式场景:
在现实的业务处理中,往往会有这样的需求:特别是应用系统需要更改和交换数据,必须传递这些更改的数据(DomainModel)交给业务逻辑层进行处理。特别是多个模块需要这种数据同步协调时,就可以用Pub/Sub这种设计模式来解决问题。
好处:降低了应用程序和业务逻辑的耦合,统一的对外Publisher(发布),减少了依赖。让我们只关心监听者监听的类型。而不需知道具体该哪一个类来处理该消息.下面的配置文件是监听器对象,通过配置显得更加灵活。(Listener.xml文件)
<MonitorConfiguration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Listeners>
<Listener classname="Listener.A" valid="true" ListenerType="System.Object" />
<Listener classname="Listener.B" valid="true" ListenerType="System.Object" />
<Listener classname="Listener.C" valid="true" ListenerType="System.Object" />
<Listener classname="Listener.D" valid="true" ListenerType="System.Object" />
</Listeners>
</MonitorConfiguration>
其中:
ClassName是监听对象的具体类型。(A,B,C,D它们都实现IActionListener这个接口的Run()这个方法)
Valid是是否有效(一个标识属性)。
ListenerType是监听对象监听消息的类型。
上面用于监听的4个对象:A,B,C,D注册到下面的MonitorFactory对象中去。当客户程序调用:
处理过程:这个对外公布的Publisher方法被调用的时候,监听者会根据监听的类型自动的通知发生依赖的其他对象。这样的客户程序就和业务逻辑实现了松耦合,降低了客户程序和业务的依赖。客户程序完全不晓得具体调用的是那一个方法,只负责向MonitorFactory发送消息对象(这里是arg参数),监听者就根据自己接受的消息自动的通知其他相关的对象。

以上是个人对Pub/Sub这种设计模式的理解,如果有什么理解不正确的地方,还请朋友们多多指教。
Best Regards,
Charles Chen
Email: gotosunny@msn.com
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述