首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何倒带应用程序状态?

如何倒带应用程序状态?
EN

Stack Overflow用户
提问于 2009-07-07 13:25:17
回答 6查看 517关注 0票数 2

我正在开发一个Java桌面飞行模拟。我需要记录在驾驶舱中发生的所有飞行员动作,例如油门控制、转向、武器部署等,以便我可以在以后查看这些事件(或现场直播)。

我想在事件的回放中添加一个视觉回放功能,这样我就可以在时间上向前和向后移动时直观地看到驾驶舱。只要我按时间顺序回放事件,回放就没有问题,但回放有点棘手。

您将如何实现倒带功能?

EN

回答 6

Stack Overflow用户

发布于 2009-07-07 13:30:29

我会使用修改后的Memento pattern

不同之处在于,我会让Memento对象存储所有试点操作的列表。

Memento模式通常用于回滚(撤消),但在您的示例中,我可以看到它也适用。您还需要将试点操作设置为可存储状态。

票数 3
EN

Stack Overflow用户

发布于 2009-07-07 13:29:39

您可以使用Command Pattern的变体,并让每个试点操作实现一个撤消操作。

例如,如果你的飞行员让动作转向左边(我知道很简单),那么它的反面就是转向右边。

代码语言:javascript
运行
复制
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;
         }
}
票数 2
EN

Stack Overflow用户

发布于 2009-07-07 13:32:55

您正在寻找的实际上是CommandMemento模式的混合体。每个试点操作都应该是您可以记录的命令。如果被请求,每个被记录的命令都有一个纪念品,用于记录(A)不在命令中并且(B)不能可靠地重建的任何附加状态。"B“很重要,在几乎任何非平凡的领域中都有一些这样的状态。需要将其存储以恢复准确的重建。

如果合并这些概念,实质上是将一个memento附加到每个命令,那么您将拥有一系列完整记录的确定性事件。

我在different answer中对此进行了更详细的讨论。不要害怕大幅调整设计模式以满足您的特定需求。:)

RE性能问题:

如果您希望频繁跳转几分钟,并且在实现之后发现这是一个不可行的性能瓶颈,我建议您偶尔实现一个带有日志记录机制的“快照”。本质上是每隔几分钟保存一次整个应用程序状态,以最大限度地减少需要执行的日志滚动量。然后,您可以从最近的已保存状态访问所需的时间范围。这类似于动画和媒体中的key frames

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1092311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档