在淘宝,我们对某类产品感兴趣,就会订阅该产品信息,当有货到后,我们会收到提示信息。

下面就简单用Dojo订阅/发布模式来说明其实现的基本原理。

大概功能需求:

买家先在产品中心注册,说自己对衣服等感兴趣,接着产品中心发布了一条新信息“衣服到新款了,亲快来采购吧”,这时买家将立即收到这条消息,并显示出来(在本例中就是在firefox浏览器的firebug模拟控制台输出这条新信息)。然后买家可能对别的信息感兴趣,再次订阅,等等重复上述过程。最后买家不打算再订阅衣服信息了,就在产品中心取消了对衣服信息的注册。大概流程就是这样子的。

果断上代码看效果,然后再来分析!

[javascript]   view plain copy print ?
  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DojoSubPub.aspx.cs" Inherits="DojoTest.DojoSubPub" %>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head runat="server">
  5. <title></title>
  6. <%-- 引入 Dojo--%>
  7. <script src="http://ajax.googleapis.com/ajax/libs/dojo/1.7.2/dojo/dojo.js"
  8. type="text/javascript"></script>
  9. <script type="text/javascript">
  10. //定义一个产品主题列表
  11. var NewsReporter = {
  12. clothes: function (message) {
  13. for (var i = 0; i < message.length; i++) {
  14. console.info("淘宝掌柜订阅提醒:" + message[i]);
  15. }
  16. },
  17. shoes: function (message) {
  18. for (var i = 0; i < message.length; i++) {
  19. console.info("淘宝掌柜订阅提醒:" + message[i]);
  20. }
  21. },
  22. mixed: function (clothes, shoes) {
  23. console.info("混合订阅提醒");
  24. this.clothes(clothes);
  25. this.shoes(shoes);
  26. }
  27. }
  28. //订阅衣服信息
  29. handle1 = dojo.subscribe("clothes news", NewsReporter, "clothes");
  30. //订阅鞋子信息
  31. handle2 = dojo.subscribe("shoes news", NewsReporter, "shoes");
  32. //订阅衣服和鞋子信息
  33. dojo.subscribe("mixed news", NewsReporter, "mixed");
  34. //发布信息
  35. dojo.publish("clothes news", [["衣服到新款了,亲快来采购吧!"]])
  36. dojo.publish("shoes news", [["鞋子到新款了,亲快来采购吧!"]]);
  37. dojo.publish("mixed news", [["衣服到新款了,快来采购吧!"], ["鞋子到新款了,快来采购吧!"]]);
  38. //取消订阅
  39. dojo.unsubscribe(handle1);
  40. dojo.unsubscribe(handle2);
  41. //发布信息
  42. dojo.publish("clothes news", [["衣服到新款了,亲快来采购吧!"]])
  43. dojo.publish("shoes news", [["鞋子到新款了,亲快来采购吧!"]]);
  44. dojo.publish("mixed news", [["衣服到新款了,快来采购吧!"], ["鞋子到新款了,快来采购吧!"]]);
  45. </script>
  46. </head>
  47. <body>
  48. </body>
  49. </html>

在控制台输出结果如下:

订阅 / 发布模式实现是比较简单的。 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 提供的“订阅/发布”模式可以看作是一个预订系统,使得事件源和事件处理函数并不直接关联,用户先预定自己感兴趣的主题,当此类主题发布时,将在第一时间得到通知。在订阅/发布模式下,预订的时候并不确定此类主题是否已存在,以后是否会发布。只是在主题发布之后,会立即得到通知。订阅/发布模式是靠主题把事件和事件处理函数联系起来的。

Dojo订阅/发布模拟淘宝到货提醒相关推荐

  1. 几招搞定淘宝签收提醒短信

    对于淘宝店来说,好评和用户体验是非常重要的,这样才能持久的发展壮大,不少淘宝店当客户签收订单后,往往会利用短信群发平台给客户发送一个签收提醒短信来进一步的提升用户体验,下面是蝶信互联小编收集整理的一些 ...

  2. jquery+原生js模拟淘宝输入框下拉提示

    1.概述: 模拟淘宝.百度的搜索框,当用户输入时,会自动下拉提示关键字,使用组件jquery.js(1.12.1),jquery-ui.js(1.12.1).jquery-ui.css(1.12.1) ...

  3. 利用python从网页查找数据_利用Python模拟淘宝的搜索过程并对数据进行可视化分析...

    数据挖掘入门与实战 公众号: datadw 本文讲述如何利用Python模拟淘宝的搜索过程并对搜索结果进行初步的数据可视化分析. 搜索过程的模拟:淘宝的搜索页面有两种形式, 一种形式是, 2019/2 ...

  4. HTML+CSS零基础学习笔记(五)— 模拟淘宝首页(静态)

    内容概览 模拟淘宝首页(静态) 一.项目重难点 二.效果图及源码 模拟淘宝首页(静态) 一.项目重难点 样式重置:在实际开发过程中,我们往往会新建一个单独的CSS文件(reset.css),用于对应H ...

  5. 【python】模拟淘宝的客服自动回复系统-socket,json,time模块的应用

    最近在研究soctet模块的过程中,尝试做个小的练习,第一反应是做个类似qq或者微信的即时聊天,这个需求相对比较简单,采用UDP协议很快就可以实现,为了提高点难度,于是决定尝试模拟淘宝的自动回复功能, ...

  6. 零基础带你用python模拟淘宝登录

    经过一段时间的学习,并参考各路大神的文章,总结出一些比较适合小白的网络爬虫的小技巧.跟着笔者的思路,循序渐进,可以慢慢找到一点小感觉. 开发环境 笔者选用的是vs code,轻量级,支持各种插件安装. ...

  7. python爬虫淘宝登录_python爬虫实现模拟淘宝登录

    就算所有人都不支持你.这条路会很曲折,你也会一度认为是不是自己选错了,但只要坚持,就算最后没有成功,但努力了就不会有遗憾. python爬虫模拟淘宝登录 小贴士 这个爬虫和搜索引擎的爬虫是有区别的.搜 ...

  8. python模拟淘宝登陆_【Python】selenium模拟淘宝登录

    # -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.common.by import By f ...

  9. js案例:模拟淘宝网

    <html><head><title>模拟淘宝网</title><meta charset="UTF-8"/><! ...

最新文章

  1. 字节跳动程序员说自己因为颜值太高被男同事集体排挤!失望透顶!准备转行!...
  2. Servlet中如何获取param-name对应的值?
  3. 【TensorFlow】占位符:tf.placeholder,与feed_dict
  4. FPGA基础之锁存器与触发器的设计
  5. 什么是Google On.Here,以及如何设置?
  6. Java基础---常用类之Arrays工具类+基本类型的包装类
  7. sql查询初学者指南_面向初学者SQL Server查询执行计划–非聚集索引运算符
  8. 精简版NovoNotes 3DX for Mac - 顶尖3D音频制作插件
  9. 【POJ 3281】Dining【最大匹配、拆点】
  10. 全国2009年1月电子商务与电子政务试题
  11. 计算机京东账户安全退出,京东账号如果提示存在风险该怎么解除?
  12. Pentaho相关组件下载,sourceforget加速
  13. Keil编译错误 error: L6050U: The code size of this image (99784 bytes) exceeds the maxim
  14. java 仿易企秀_鲁班H5(开源可视化搭建系统, 可以理解为开源版本易企秀)核心实现原理解析...
  15. 如何为iTunes Connect准备应用
  16. [转] 两篇关于flash 职业和webgame的文章
  17. python实现标号法确定最短路径
  18. word利用mathtype进行公式分章节编号和引用
  19. 用灌水法解NOIP2017提高组D2第一题:奶酪
  20. 向量化执行引擎是怎么玩的?

热门文章

  1. amd同步多线程_AMD发布锐龙3 3300X/3100:首次实现同步多线程
  2. android a标签无法跳转,a标签不能在手机端正常跳转?来看看是不是这么设置的...
  3. Packet Tracer - 在思科路由器上配置 AAA 认证
  4. Virtualbox最全扩展虚拟磁盘空间大小(vdi/vmdk)方法(Mac/Linux/Windows)
  5. 【Devc++】迷宫小游戏1.0
  6. 周总结2022.1.17-2022.1.23
  7. linux中写crontab脚本,Linux中crond服务与crontab用法
  8. 网站流量日志数据分析系统(一)
  9. Stream流—常用简单方法
  10. 【AAAI2020】强化学习玩王者荣耀