在淘宝我们对某类产品感兴趣就会订阅该产品信息当有货到后我们会收到提示信息 下面就简单用Dojo订阅/发布模式来说明其实现的基本原理 大概功能需求 买家先在产品中心注册说自己对衣服等感兴趣接着产品中心发布了一条新信息衣服到新款了亲快来采购吧这时买家将立即收到这条消息并显示出来(在本例中就是在firefox浏览器的firebug模拟控制台输出这条新信息)然后买家可能对别的信息感兴趣再次订阅等等重复上述过程最后买家不打算再订阅衣服信息了就在产品中心取消了对衣服信息的注册大概流程就是这样子的 果断上代码看效果然后再来分析! [javascript] <%@ Page Language=C# AutoEventWireup=true CodeBehind=DojoSubPubaspxcs Inherits=DojoTestDojoSubPub %> <!DOCTYPE html PUBLIC //WC//DTD XHTML Transitional//EN transitionaldtd> <html xmlns=> <head runat=server> <title></title> <% 引入 Dojo%> <script src= type=text/javascript></script> <script type=text/javascript> //定义一个产品主题列表 var NewsReporter = { clothes: function (message) { for (var i = ; i < messagelength; i++) { (淘宝掌柜订阅提醒 + message[i]) } } shoes: function (message) { for (var i = ; i < messagelength; i++) { (淘宝掌柜订阅提醒 + message[i]) } } mixed: function (clothes shoes) { (混合订阅提醒) thisclothes(clothes) thisshoes(shoes) } } //订阅衣服信息 handle = dojosubscribe(clothes news NewsReporter clothes) //订阅鞋子信息 handle = dojosubscribe(shoes news NewsReporter shoes) //订阅衣服和鞋子信息 dojosubscribe(mixed news NewsReporter mixed) //发布信息 dojopublish(clothes news [[衣服到新款了亲快来采购吧!]]) dojopublish(shoes news [[鞋子到新款了亲快来采购吧!]]) dojopublish(mixed news [[衣服到新款了快来采购吧!] [鞋子到新款了快来采购吧!]]) //取消订阅 dojounsubscribe(handle) dojounsubscribe(handle) //发布信息 dojopublish(clothes news [[衣服到新款了亲快来采购吧!]]) dojopublish(shoes news [[鞋子到新款了亲快来采购吧!]]) dojopublish(mixed news [[衣服到新款了快来采购吧!] [鞋子到新款了快来采购吧!]]) </script> </head> <body> </body> </html> <%@ Page Language=C# AutoEventWireup=true CodeBehind=DojoSubPubaspxcs Inherits=DojoTestDojoSubPub %> <!DOCTYPE html PUBLIC //WC//DTD XHTML Transitional//EN transitionaldtd> <html xmlns=> <head runat=server> <title></title> <% 引入 Dojo%> <script src= type=text/javascript></script> <script type=text/javascript> //定义一个产品主题列表 var NewsReporter = { clothes: function (message) { for (var i = ; i < messagelength; i++) { (淘宝掌柜订阅提醒 + message[i]) } } shoes: function (message) { for (var i = ; i < messagelength; i++) { (淘宝掌柜订阅提醒 + message[i]) } } mixed: function (clothes shoes) { (混合订阅提醒) thisclothes(clothes) thisshoes(shoes) } } //订阅衣服信息 handle = dojosubscribe(clothes news NewsReporter clothes) //订阅鞋子信息 handle = dojosubscribe(shoes news NewsReporter shoes) //订阅衣服和鞋子信息 dojosubscribe(mixed news NewsReporter mixed) //发布信息 dojopublish(clothes news [[衣服到新款了亲快来采购吧!]]) dojopublish(shoes news [[鞋子到新款了亲快来采购吧!]]) dojopublish(mixed news [[衣服到新款了快来采购吧!] [鞋子到新款了快来采购吧!]]) //取消订阅 dojounsubscribe(handle) dojounsubscribe(handle) //发布信息 dojopublish(clothes news [[衣服到新款了亲快来采购吧!]]) dojopublish(shoes news [[鞋子到新款了亲快来采购吧!]]) dojopublish(mixed news [[衣服到新款了快来采购吧!] [鞋子到新款了快来采购吧!]]) </script> </head> <body> </body> </html> 在控制台输出结果如下 订阅 / 发布模式实现是比较简单的 dojo 维护了一个主题列表用户订阅某一主题时即把此主题及其处理函数添加到主题列表中当有此类主题发布时跟这一主题相关的处理函数会被顺序调用 我们上面的代码就是说明其是如何工作的 在 Dojo 中跟主题订阅 / 发布有关的函数有三个 dojosubscribe = function(topiccontextmethod) subscribe 函数用来订阅某一主题参数 topic 表示主题名字是一个字符串 context 是接收到主题后调用的事件处理函数所在的对象function 是事件处理函数名 dojounsubscribe = function(handle) 取消对于某一主题的订阅参数 handle 是 dojosubscribe 返回的句柄 dojopublish = function(topic args) 发布某一主题参数 topic 是主题的名字args 表示要传递给主题处理函数的参数它是一个数组可以通过它传递多个参数给事件处理函数 注意点 如果用户使用了相同的处理函数重复订阅某一主题两次在主题列表中这是不同的两项只是他们都对同一主题感兴趣当此类主题发布时这两个处理函数都会被调用而不会出现第二个处理函数覆盖第一个处理函数的状况 先订阅再发布主题发布的时候订阅了这一主题的事件处理函数会被立即调用 发布函数的参数为数组发布第一条消息时使用的是[[衣服到新款了亲快来采购吧!]]这是一个二维数组因为事件处理函数 NewsReporterclothesNewsReportershoes以及 NewsReportermixed 的参数已经是一个数组所以在发布时必须把消息事件这个数组再放在另一个数组中才能传递给这些事件处理函数而 mixed 消息的处理函数有两个参数所以发布 mixed 的消息时参数为 [[衣服到新款了快来采购吧!] [鞋子到新款了快来采购吧!]] 二维数组中的第一个数组表示衣服第二个数组表示鞋子 取消订阅时必须把所有的订阅都取消重复的订阅行为返回的句柄是不一样的在本例中 handle 和 handle 是不同的必须都注销只有在 handle 和 handle 都被注销后产品中心发布的消息才不会被这个买家接收到 总结 如果你对设计模式有所了解会发现Dojo订阅/发布与《观察者模式》非常相似 Dojo 提供的订阅/发布模式可以看作是一个预订系统使得事件源和事件处理函数并不直接关联用户先预定自己感兴趣的主题当此类主题发布时将在第一时间得到通知在订阅/发布模式下预订的时候并不确定此类主题是否已存在以后是否会发布只是在主题发布之后会立即得到通知订阅/发布模式是靠主题把事件和事件处理函数联系起来的 |