1. 什么是主动对象?

参见《上篇:ACE技术论文集》第6章 和《ACE 程序员指南》第15章 归纳如下:

  Active object(主动对象)模式是一种专门设计的模式,该模式使方法执行与方法调用去耦合,以简化对驻留在它自己的线程控制中的对象的同步访问。该模式以这样的需求为基础:两个主动对象应该能通过看起来像是常规方法调用的方法进行通信,但这些方法将在接受者的上下文、而不是调用者的上下文中执行。

  本人自己的认识总结如下:

总的一句话就是:主动对象实现了方法的异步执行.

2.主动对象是怎么实现的?

      主动对象(active object) 使用了 代理模式和命令模式(参见 GOF 常见设计模式),此模式由下面几个类组成:

代理(proxy)类

      客户通过代理发出请求.代理类把方法的调用,转换成方法的请求,并把转换得到的方法请求插入激活队列中.同时,此类保存了一个仆人类对象的引用.之所以叫仆人类,是因为这个类是干活的,完成功能需求的.具体可参见 代理模式.

方法请求(method requst)

      以对象的形式封装方法调用的对象,此类保存一个仆人类对象的引用.通过此类,代理类将客户的请求转换成方法请求.方法请求(method requst) 主要是采用 命令模式.

调度者(scheduler)

      调度者类拥有一个指向激活队列的引用,主动对象所使用的私有控制线程会在这个队列上保持阻塞,直到有新的方法请求到达.该私有线程会苏醒过来,从激活队列中取出请求,然后执行它.这里,所说的私有线程就是方法的执行线程,不同于方法的调用线程.

激活队列(activation queue)

      调度者类持有的优先级队列.所有的方法请求都由代理类对象放在这个队列中,并优主动对象的私有线程拾取.

仆人类(servant)

      方法的具体实现者,与线程管理的细节没有关系.

期货(future)和期货观察者(future observer)

      期货就是返回给客户一个调用方法的"结果",客户端可以通过期货获取异步操作结果.期货观察者就是与期货相关联的一个回调对象.