我有一个通过RMI公开的远程对象,我用它来对象所拥有的资源执行几项操作。现在我有我需要执行的每个操作的方法。
示例:
public interface IRobotController {
public int walk(int meters);
public void dance(int seconds);
}
public interface RMIRobotController implements IRobotController, java.rmi.Remote {}
public class RobotController implements RMIRobotController {
private Robot robot;
...
public int walk(int meters) {
return robot.walk(meters);
}
public void dance(int seconds) {
robot.dance(seconds);
}
}
我想重构API,以便我只有一个方法operate()
。假设我不想通过RMI返回对机器人对象的实际引用,因为我有时需要执行多个操作,并且不希望往返。
我基于Callable<T>
:
public abstract class RobotCallable<T> {
protected Robot robot;
public void setRobot(Robot robot) {
this.robot = robot;
}
public abstract T call()
}
public class RobotController implements RMIRobotController {
private Robot robot;
...
public T operate(RobotCallable<T> robotCallable) {
robotCallable.setRobot(robot)
return robotCallable.call();
}
}
我这通常是如何实现的? RMI是否有一些自动执行此操作的机制?
答案 0 :(得分:1)
您要做的事情称为命令模式 使用此模式的目的是减少耦合。
据说这不会发生,因为每次进行更改和编译时,序列化ID都不匹配。
拨打电话时,您的安全性会下降。
您必须实现自己的消息格式,在其中放置有效负载和消息marshall,然后在到达时解组(这通常使用XML来完成)。
基本上通过将命令模式与RMI一起使用,您将失去RMI的所有好处,并将其用作传输。
如果这是您的目标,那么WebServices将是一个更好的方法。
答案 1 :(得分:0)
为什么要将接口缩减为一个API?在接口中支持多个远程方法的成本非常低:您只需要声明它们,编写它们并调用它们。没有任何RMI开销。而且你必须编写代码来执行每个操作, plus 代码从operation()发送到所需的代码段,这些代码将为您提供单独的方法。结果更加清晰。