Chinaunix首页 | 论坛 | 博客
  • 博客访问: 485907
  • 博文数量: 55
  • 博客积分: 1867
  • 博客等级: 上尉
  • 技术积分: 587
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-29 01:33
文章分类

全部博文(55)

文章存档

2013年(1)

2012年(2)

2011年(16)

2010年(11)

2009年(5)

2008年(10)

2007年(8)

2006年(2)

分类: 系统运维

2011-01-30 16:36:17

  一、需求分析
 
    在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 来处理这个消息。
 
未完待续...
阅读(3377) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~