一、需求分析
在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(其实,我本人从未用过这个类,但大概能猜出它的含义),我们为这个邮局的类定义如下:
- /**
-
* Define the EventQueue class based on subscribe/publish mode
-
*/
-
js.awt.EventQueue = function(){
-
/**
-
* Subscribe a message from EventQueue
-
*
-
* @param msgId, what
-
* @param listener, who
-
* @param handler, where
-
*/
-
this.register = function(msgId, listener, handler){
-
// TODO: Register to DB
-
-
};
-
-
/**
-
* Schedule system use this method to dispatch a message to
-
* listeners
-
*
-
* @param msg
-
*/
-
this.dispatch = function(msg){
-
// TODO: Dispatch message to listeners
-
-
};
-
-
/**
-
* Message sender use this method to post a message and
-
* return immediately
-
*
-
* @param msg
-
*/
-
this.post = function(msg){
-
// TODO: Put this message to the message queue.
-
-
};
-
-
/**
-
* Message sender use this method to send a message and
-
* blocked till to all receivers process this message completely
-
*
-
* @param msg
-
*/
-
this.send = function(msg){
-
// TODO: Deliver this message to receiver directly
-
-
};
-
-
}.$extend(ls.lang.Object);
上面的代码中, register 方法对应 Subscribe 用例, dispatch 方法对应 Deliver 用例, post/send 方法对应 Publish 用例,这里还需要对这个“邮局”的功能再注释一下:
- Subscribe 用例, 对应 register 方法,用于消息接收者向“邮局”注册自己的 what, who, where 三要素。
- what 可以理解为消息的种类标示;
- who 在OO编程中自然是指消息接收者对象本身;
- where 是指消息接收者使用什么方法来处理消息。
- Publish 用例, 有两个方法 post 和 send。
- post 方法用于异步消息的发送,也就是消息的发送者在 post 消息后, post 方法会立即返 回,而消息交由调度系统发送。
- send 方法用于同步消息的发送, 即消息的发送者在 send 消息后, send 方法将会被阻塞直到消息的接收者处理完消息。
- Deliver 用例, 对应 dispatch 方法,这个方法由调度系统调用。同时当使用 send 方法发送消息时,消息不通过调度系统发送。
- 不限制任何对象既作为消息的发布者又作为消息的接收者。
- 不限制对象发送何种消息,任何对象都可以发送其业务规定的多种type的消息,一种消息就是一种type的 what。
- 不限制对象接收何种消息,任何对象都可以接收其业务规定的多种type的消息,一种消息就对应一个 where 来处理这个消息。
未完待续...
阅读(3377) | 评论(0) | 转发(0) |