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

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

<?
xml version=”1.0″
?>


<
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对象中去。当客户程序调用:

MonitorFactory.Publisher(
new
 
object
());

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

《Publish/Subscribe(发布/订阅)设计模式(Observer模式)》
《Publish/Subscribe(发布/订阅)设计模式(Observer模式)》
Subject对象

 public class MonitorFactory
    {
        
private static MonitorConfiguration configuration;
        
static MonitorFactory()
        {
            configuration
=ObjectXmlSerializer.LoadFromXml<MonitorConfiguration>(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Listener.xml));
        }

        /// <summary>
        
/// 对外发布数据
        
/// </summary>
        
/// <param name=”arg”></param>
        public static bool Publisher(object arg)
        {
            
bool result = false;
            
if (configuration != null && configuration.Listeners != null && configuration.Listeners.Count > 0)
            {
                IActionListener listener 
= null;
                
foreach (ListenerItem item in configuration.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);
                                }
                            }
                        }
                    }
                }
            }
            
return result;
        }      
    }

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

Best Regards,

Charles Chen

Email: gotosunny@msn.com

    原文作者:设计模式
    原文地址: http://www.cnblogs.com/Charles2008/archive/2009/03/07/1405506.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞