Publish/Subscribe(发布/订阅)设计模式(Observer模式)

摘要:
Observer模式在Designpatterns用于:一个对象观察者被注入到另一个对象,用于监听事件,观察者暗中地反映的变化。publish/subscribe模式在主体和观察者之间增加了一层间隔。Pub模式主要是负责向外发送消息,Sub主要是订阅消息。特别是多个模块需要这种数据同步协调时,就可以用Pub/Sub这种设计模式来解决问题。˃其中:ClassName是监听对象的具体类型。Subject对象publicclassMonitorFactory{privatestaticMonitorConfigurationconfiguration;staticMonitorFactory(){configuration=ObjectXmlSerializer.LoadFromXml;}//////对外发布数据//////publicstaticboolPublisher{boolresult=false;if(configuration!

记得已经写过一篇关于(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文件)

<?xmlversion="1.0"?><MonitorConfigurationxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema"><Listeners><Listenerclassname="Listener.A"valid="true"ListenerType="System.Object"/><Listenerclassname="Listener.B"valid="true"ListenerType="System.Object"/><Listenerclassname="Listener.C"valid="true"ListenerType="System.Object"/><Listenerclassname="Listener.D"valid="true"ListenerType="System.Object"/></Listeners></MonitorConfiguration>

其中:

ClassName是监听对象的具体类型。(A,B,C,D它们都实现IActionListener这个接口的Run()这个方法)

Valid是是否有效(一个标识属性)。

ListenerType是监听对象监听消息的类型。

上面用于监听的4个对象:A,B,C,D注册到下面的MonitorFactory对象中去。当客户程序调用:

MonitorFactory.Publisher(newobject());

处理过程:这个对外公布的Publisher方法被调用的时候,监听者会根据监听的类型自动的通知发生依赖的其他对象。这样的客户程序就和业务逻辑实现了松耦合,降低了客户程序和业务的依赖。客户程序完全不晓得具体调用的是那一个方法,只负责向MonitorFactory发送消息对象(这里是arg参数),监听者就根据自己接受的消息自动的通知其他相关的对象。

Publish/Subscribe(发布/订阅)设计模式(Observer模式)第1张Publish/Subscribe(发布/订阅)设计模式(Observer模式)第2张Subject对象
publicclassMonitorFactory
{
privatestaticMonitorConfigurationconfiguration;
staticMonitorFactory()
{
configuration
=ObjectXmlSerializer.LoadFromXml<MonitorConfiguration>(Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"Listener.xml"));
}
///<summary>///对外发布数据
///</summary>///<paramname="arg"></param>publicstaticboolPublisher(objectarg)
{
boolresult=false;
if(configuration!=null&&configuration.Listeners!=null&&configuration.Listeners.Count>0)
{
IActionListenerlistener
=null;
foreach(ListenerItemiteminconfiguration.Listeners)
{
if(item.Valid)
{
listener
=(IActionListener)Activator.CreateInstance(Type.GetType(item.ClassName));
if(listener!=null)
{
if(string.IsNullOrEmpty(item.ListenerType))
{
listener.Run(arg);
}
else
{
if(item.ListenerType==arg.GetType().FullName)
{
listener.Run(arg);
}
}
}
}
}
}
returnresult;
}
}

以上是个人对Pub/Sub这种设计模式的理解,如果有什么理解不正确的地方,还请朋友们多多指教。

Best Regards,

Charles Chen

Email: gotosunny@msn.com

免责声明:文章转载自《Publish/Subscribe(发布/订阅)设计模式(Observer模式)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇windows 7 SDK和DDK下载地址CentOS7安装zabbix下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

npm publish失败,报错400 Bad Request

文章原文: https://www.cnblogs.com/yalong/p/15208874.html 今天新搞了一个npm 包 在 npm publish 的时候失败了,错误提示如下: npm ERR! code E400 npm ERR! 400 Bad Request - PUT https://registry.npmjs.org/table-t...

Redis的Publish/Subscribe

Publish/Subscribe 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。这一功能最明显的用法就是用作实时消息系统,比如普通的即时聊天,群聊等功能。 相关命令参考:http://www.re...

Xadmin弹出窗口

需求分析: 1.在添加页面的一对多和多对多字段后面加上+,点击+后,能显示出添加相应字段的窗口 2.提交后窗口关闭,添加的内容显示到当前页面 1.判断出当前字段是否为ForeignKey或ManyToManyField, 如果是则在后面添加+,不是则不添加。如果不进行判断,每个字段后面都会有+ {% for foo in form_obj %} &...

drf序列化组件

一. 序列化组件介绍# Copy 1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 2. 反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型 3. 反序列化,完成数据校验功能 二. 简单使用# 步骤: Copy 1. 写一个序列化的类,继承Serializer 2....

ModelViewSet的使用

1.models from rest_framework.viewsets importModelViewSet classpublish(ModelViewSet): queryset =models.Book.objects.all() serializer_class =Myserializations.BookModelSerial...

如何使用 MQTT 报文实现发布订阅功能

MQTT 协议通过交换预定义的MQTT控制报文来通信。下面以 MQTTX 为例,展示如何通过 MQTT 报文实现发布订阅功能。 Connect 连接 MQTT 协议基于 TCP/IP 协议,MQTT Broker 和 Client 都有需要有 TCP/IP 地址。 Broker 如果你暂时没有一个可用的 MQTT Broker,EMQ X 提供了一个公共...