我正在开发一个Java桌面飞行模拟。我需要记录在驾驶舱中发生的所有飞行员动作,例如油门控制、转向、武器部署等,以便我可以在以后查看这些事件(或现场直播)。
我想在事件的回放中添加一个视觉回放功能,这样我就可以在时间上向前和向后移动时直观地看到驾驶舱。只要我按时间顺序回放事件,回放就没有问题,但回放有点棘手。
您将如何实现倒带功能?
发布于 2009-07-07 13:30:29
我会使用修改后的Memento pattern。
不同之处在于,我会让Memento对象存储所有试点操作的列表。
Memento模式通常用于回滚(撤消),但在您的示例中,我可以看到它也适用。您还需要将试点操作设置为可存储状态。
发布于 2009-07-07 13:29:39
您可以使用Command Pattern的变体,并让每个试点操作实现一个撤消操作。
例如,如果你的飞行员让动作转向左边(我知道很简单),那么它的反面就是转向右边。
public interface IPilotAction {
void doAction(CockpitState state);
void undoAction(CockpitState state);
}
public class ThrottleControl implement IPilotAction {
private boolean increase;
private int speedAmount;
public ThrottleControl(boolean increase, int speedAmount) {
this.increase = increase;
this.speedAmount = speedAmount;
}
public void doAction(CockpitState state) {
if (increase) {
state.speed += speedAmount;
} else {
state.speed -= speedAmount;
}
}
public void undoAction(CockpitState state) {
if (increase {
state.speed -= speedAmount;
} else {
state.speed += speedAmount;
}
}
发布于 2009-07-07 13:32:55
您正在寻找的实际上是Command和Memento模式的混合体。每个试点操作都应该是您可以记录的命令。如果被请求,每个被记录的命令都有一个纪念品,用于记录(A)不在命令中并且(B)不能可靠地重建的任何附加状态。"B“很重要,在几乎任何非平凡的领域中都有一些这样的状态。需要将其存储以恢复准确的重建。
如果合并这些概念,实质上是将一个memento附加到每个命令,那么您将拥有一系列完整记录的确定性事件。
我在different answer中对此进行了更详细的讨论。不要害怕大幅调整设计模式以满足您的特定需求。:)
RE性能问题:
如果您希望频繁跳转几分钟,并且在实现之后发现这是一个不可行的性能瓶颈,我建议您偶尔实现一个带有日志记录机制的“快照”。本质上是每隔几分钟保存一次整个应用程序状态,以最大限度地减少需要执行的日志滚动量。然后,您可以从最近的已保存状态访问所需的时间范围。这类似于动画和媒体中的key frames。
https://stackoverflow.com/questions/1092311
复制相似问题