免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1279 | 回复: 0

JavaScript对象间基于Message的同步/异步通信(一) [复制链接]

论坛徽章:
0
发表于 2011-12-19 14:02 |显示全部楼层
  一、需求分析
 
    在JavaScript里采用OO编程思想后,和其它语言一样(Java, C/C++等)通常都会面临对象间通信的问题。我们知道一般意义上的对象间通信,就是对象方法的调用,比如对象A要驱动对象B完成某一任务,那么对象A会调用对象B的一个方法,并传入相应的参数。如图:


不过这种通信方式有一个前提,就是对象A可以直接访问到对象B,也就是说对象A和对象B之间是紧密耦合的。然而,在有些时候(也许是很多时候),对象A也许不能直接访问对象B,甚至于对象A可能都不知道对象B的存在。那么这种情况下如果对象A还要驱动对象B完成某一任务,就只有借助所谓的Message系统来传递信息了。如图:



当然这种通信方式也有一个前提,就是对象A,对象B都需要知道Messenger,不过这不是问题,因为Messenger通常都是作为系统服务提供。
  
  二、 用例设计

         在JavaScript里如何实现Messenger服务呢,方法很多,这里提供一种常见的,基于订阅/发布模式(subscribe/publish)的简单实现。所谓订阅/发布模式很好理解,就像你从邮局订阅某种期刊,当期刊的发行者有新的期刊时,他会把期刊交给邮局,而邮局负责把期刊投送到你手里。可以用下面这个用例图来描述这个邮局:


用JavaScript如何描述这个邮局呢,既然是OO编程,我们自然还是用对象来定义这个邮局,由于比较偏向Java的风格,所以就沿用了Java的类名字java.awt.EventQueue(其实,我本人从未用过这个类,但大概能猜出它的含义),我们为这个邮局的类定义如下:

  1. /**
  2.  * Define the EventQueue class based on subscribe/publish mode
  3.  */
  4. js.awt.EventQueue = function(){
  5.     /**
  6.      * Subscribe a message from EventQueue
  7.      *
  8.      * @param msgId, what
  9.      * @param listener, who
  10.      * @param handler, where
  11.      */
  12.     this.register = function(msgId, listener, handler){
  13.         // TODO: Register to DB

  14.     };
  15.     
  16.     /**
  17.      * Schedule system use this method to dispatch a message to
  18.      * listeners
  19.      *
  20.      * @param msg
  21.      */
  22.     this.dispatch = function(msg){
  23.         // TODO: Dispatch message to listeners
  24.         
  25.     };

  26.     /**
  27.      * Message sender use this method to post a message and
  28.      * return immediately
  29.      *
  30.      * @param msg
  31.      */
  32.     this.post = function(msg){
  33.         // TODO: Put this message to the message queue.

  34.     };

  35.     /**
  36.      * Message sender use this method to send a message and
  37.      * blocked till to all receivers process this message completely
  38.      *
  39.      * @param msg
  40.      */
  41.     this.send = function(msg){
  42.         // TODO: Deliver this message to receiver directly

  43.     };
  44.     
  45. }.$extend(ls.lang.Object);
上面的代码中, register 方法对应 Subscribe 用例, dispatch 方法对应 Deliver 用例, post/send 方法对应 Publish 用例,这里还需要对这个“邮局”的功能再注释一下:

  • Subscribe 用例, 对应 register 方法,用于消息接收者向“邮局”注册自己的 what, who, where 三要素。
  1. what  可以理解为消息的种类标示;
  2. who   在OO编程中自然是指消息接收者对象本身; 
  3. where 是指消息接收者使用什么方法来处理消息。
  • Publish 用例, 有两个方法 post 和 send。
    1. post 方法用于异步消息的发送,也就是消息的发送者在 post 消息后, post 方法会立即返 回,而消息交由调度系统发送。
    2. send 方法用于同步消息的发送, 即消息的发送者在 send 消息后, send 方法将会被阻塞直到消息的接收者处理完消息。
  • Deliver 用例, 对应 dispatch 方法,这个方法由调度系统调用。同时当使用 send 方法发送消息时,消息不通过调度系统发送。
  • 不限制任何对象既作为消息的发布者又作为消息的接收者。
  • 不限制对象发送何种消息,任何对象都可以发送其业务规定的多种type的消息,一种消息就是一种type的 what。
  • 不限制对象接收何种消息,任何对象都可以接收其业务规定的多种type的消息,一种消息就对应一个 where 来处理这个消息。
 
未完待续...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP