在淘寶,我們對某類產品感興趣,就會訂閱該產品信息,當有貨到後,我們會收到提示信息。

 

下面就簡單用Dojo訂閱/發布模式來說明其實現的基本原理。

 

大概功能需求:

買家先在產品中心注冊,說自己對衣服等感興趣,接着產品中心發布了一條新信息衣服到新款了,親快來采購吧”,這時買家將立即收到這條消息,並顯示出來(在本例中就是在firefox瀏覽器的firebug模擬控制台輸出這條新信息)。然後買家可能對別的信息感興趣,再次訂閱,等等重复上述過程。最後買家不打算再訂閱衣服信息了,就在產品中心取消了對衣服信息的注冊。大概流程就是這样子的。

 

果斷上代碼看效果,然後再來分析!

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DojoSubPub.aspx.cs" Inherits="DojoTest.DojoSubPub" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
      <%-- 引入 Dojo--%>
    <script src="http://ajax.googleapis.com/ajax/libs/dojo/1.7.2/dojo/dojo.js"
        type="text/javascript"></script>

    <script type="text/javascript">

        //定義一個產品主題列表
        var NewsReporter = {
            clothes: function (message) {
                for (var i = 0; i < message.length; i++) {
                    console.info("淘寶掌櫃訂閱提醒:" + message[i]);
                }
            },

            shoes: function (message) {
                for (var i = 0; i < message.length; i++) {
                    console.info("淘寶掌櫃訂閱提醒:" + message[i]);
                }
            },

            mixed: function (clothes, shoes) {
                console.info("混合訂閱提醒");
                this.clothes(clothes);
                this.shoes(shoes);
            }
        }

        //訂閱衣服信息
        handle1 = dojo.subscribe("clothes news", NewsReporter, "clothes");
        //訂閱鞋子信息
        handle2 = dojo.subscribe("shoes news", NewsReporter, "shoes");
        //訂閱衣服和鞋子信息
        dojo.subscribe("mixed news", NewsReporter, "mixed");

        //發布信息
        dojo.publish("clothes news", [["衣服到新款了,親快來采購吧!"]])
        dojo.publish("shoes news", [["鞋子到新款了,親快來采購吧!"]]);
        dojo.publish("mixed news", [["衣服到新款了,快來采購吧!"], ["鞋子到新款了,快來采購吧!"]]);

        //取消訂閱
        dojo.unsubscribe(handle1);
        dojo.unsubscribe(handle2);

        //發布信息
        dojo.publish("clothes news", [["衣服到新款了,親快來采購吧!"]])
        dojo.publish("shoes news", [["鞋子到新款了,親快來采購吧!"]]);
        dojo.publish("mixed news", [["衣服到新款了,快來采購吧!"], ["鞋子到新款了,快來采購吧!"]]);
    </script>
</head>
<body>
 
</body>
</html>


 

在控制台輸出結果如下:

1345034632_9196  

訂閱 / 發布模式實現是比較簡單的。 dojo 維護了一個主題列表,用戶訂閱某一主題時,即把此主題及其處理函數添加到主題列表中。當有此類主題發布時,跟這一主題相關的處理函數會被順序調用。

我們上面的代碼就是說明其是如何工作的。

 

在 Dojo 中,跟主題訂閱 / 發布有關的函數有三個:

 

dojo.subscribe = function(topic,context,method)

subscribe 函數用來訂閱某一主題;参數 topic 表示主題名字,是一個字符串; context 是接收到主題後調用的事件處理函數所在的對象,function 是事件處理函數名。

 

dojo.unsubscribe = function(handle)

取消對於某一主題的訂閱;参數 handle 是 dojo.subscribe 返回的句柄

 

dojo.publish = function(topic, args)

發布某一主題;参數 topic 是主題的名字,args 表示要傳遞给主題處理函數的参數,它是一個數組,可以通過它傳遞多個参數给事件處理函數。

 

注意點:

1、如果用戶使用了相同的處理函數重复訂閱某一主題兩次,在主題列表中這是不同的兩項,只是他們都對同一主題感興趣。當此類主題發布時,這兩個處理函數都會被調用,而不會出現第二個處理函數覆蓋第一個處理函數的狀況。

 

2、先訂閱,再發布。主題發布的時候,訂閱了這一主題的事件處理函數會被立即調用。

 

3、發布函數的参數为數組,發布第一條消息時使用的是[["衣服到新款了,親快來采購吧!"]],這是一個二維數組,因为事件處理函數 NewsReporter.clothes,NewsReporter.shoes,以及  NewsReporter.mixed 的参數已經是一個數組,所以在發布時必須把消息事件這個數組再放在另一個數組中才能傳遞给這些事件處理函數。而“ mixed ”消息的處理函數有兩個参數,所以發布“ mixed ”的消息時,参數为:

[["衣服到新款了,快來采購吧!"], ["鞋子到新款了,快來采購吧!"]]

二維數組中的第一個數組表示衣服,第二個數組表示鞋子。

 

4、取消訂閱時,必須把所有的訂閱都取消。重复的訂閱行为返回的句柄是不一样的,在本例中 handle1 和 handle2 是不同的,必須都注銷。只有在 handle1 和 handle2 都被注銷後,產品中心發布的消息才不會被這個買家接收到。

 

總結:

如果你對設計模式有所了解,會發現Dojo“訂閱/發布”與《觀察者模式》非常相似。

Dojo 提供的“訂閱/發布”模式可以看作是一個預訂系統,使得事件源和事件處理函數並不直接關聯,用戶先預定自己感興趣的主題,當此類主題發布時,將在第一時間得到通知。在訂閱/發布模式下,預訂的時候並不確定此類主題是否已存在,以後是否會發布。只是在主題發布之後,會立即得到通知。訂閱/發布模式是靠主題把事件和事件處理函數聯系起來的。

 

 

 


From:CSDN        

 




創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()