Active Object模式

Active Object模式

Active是“主动的”意思,因此Active Object就是“主动对象”的意思。所谓的“主动的”,一般指“有自己特有的线程”。因此,举例来说,Java的java.lang.Thread类的实例就是一种主动对象。

不过,在Active Object模式中出厂的主动对象可不仅仅“有自己特有的线程”。它同时还具有可以从外部接受和处理异步消息并根据需要返回处理结果的特征。

Active Object模式中的主动对象会通过自己特有的线程在适合的时机处理从外部接受到的异步消息。

在Active Object模式中,组成主动对象与许多自然人组成法人类似。及时是Java语言这种没有异步消息的编程语言,也可以使用Active Object模式组成实际上能够处理异步消息的主动对象。

类的一览表

主动对象由ActiveObjectFactory类创建,实现了ActiveObject接口。使用主动对象的线程时MakerClientThread类和DisplayClientThread类。这些线程会各自向主动对象发送异步的“生成字符串”和“显示字符串”的请求。

名字 说明
无名 Main 测试程序行为的类
无名 MakerClientThread 发出“生成字符串”请求的线程
activeObject DisplayClientThread 发出“显示字符串”请求的线程
activeObject ActiveObject 定义“主动对象”的接口(API)的接口
activeObject ActiveObjectFactory 创建“主动对象”的类
activeObject Proxy 将方法调用转换为MethodRequest对象的类(实现了ActiveObject的接口)
activeObject SchedulerThread 调用ececute方法处理MethodRequest对象的类
activeObject ActivationQueue 按顺序保存MethodRequest对象的类
activeObject MethodRequest 表示请求的抽象类
activeObject MakeStringRequest makeString方法(生成字符串)对应的类。MethodRequest的子类
activeObject DisplayStringRequest displayString方法(显示字符串)对应的类。MethodRequest的子类
activeObject Result 表示执行结果的抽象类
activeObject FutureResult 在Future模式中表示执行结果的类
activeObject RealResult 表示实际的执行结果的类
activeObject Servant 执行实际处理的类(实现了ActiveObject接口)

调用方:MakerClientThread类

MakerClientThread类是调用主动对象的makeString方法(生成字符串)的线程。

activeObject字段中保存的是ActiveObject对象。MakerClientThread类会调用该对象的makeString方法。

makeString方法会在被调用后立即返回。这里的调用相当于将“生成字符串”这个异步消息传递给主动对象。

虽然makeString的返回值是Result类型,但是实际上这里使用的是Future模式。使用getResultValue方法可以获取实际的返回值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class MakerClientThread extends Thread {
private final ActiveObject activeObject;
private final char fillChar;

public MakerClientThread(String name, ActiveObject activeObject) {
super(name);
this.activeObject = activeObject;
this.fillChar = name.charAt(0);
}

public void run() {
try {
for (int i = 0;true;i++) {
Result<String> result = activeObject.makeString(i, fillChar);
Thread.sleep(10);
String value = result.getResultValue();
System.out.println(Thread.currentThread().getName() + ": value = " + value);
}
} catch (InterruptedException e) {
System.out.println(e.getMessage());
}
}
}

调用方:

0%