Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
处理通信协议对象的模式 我正在使用java应用程序和C++编写的本地应用程序之间实现通信协议。消息是事件驱动的:当事件在C++应用程序中发生时,将生成并发送TypBuf消息。 message MyInterProcessMessage { int32 id = 1; message EventA { ... } message EventB { ... } ... }_Java_Design Patterns_Communication_Protocol Buffers - Fatal编程技术网

处理通信协议对象的模式 我正在使用java应用程序和C++编写的本地应用程序之间实现通信协议。消息是事件驱动的:当事件在C++应用程序中发生时,将生成并发送TypBuf消息。 message MyInterProcessMessage { int32 id = 1; message EventA { ... } message EventB { ... } ... }

处理通信协议对象的模式 我正在使用java应用程序和C++编写的本地应用程序之间实现通信协议。消息是事件驱动的:当事件在C++应用程序中发生时,将生成并发送TypBuf消息。 message MyInterProcessMessage { int32 id = 1; message EventA { ... } message EventB { ... } ... },java,design-patterns,communication,protocol-buffers,Java,Design Patterns,Communication,Protocol Buffers,在Java中,我在套接字上收到一个类的对象:MyInterProcessMessageProto。从这里,我可以非常容易地获取数据,因为它们彼此封装在一起:myMessage.getEventA().getName() 我面临两个问题: 如何委托处理接收到的消息 因为,分析整个消息并区分不同的事件类型以及它们所暗示的操作,导致了一个庞大且不可维护的方法,其中包含许多if案例 我想找到一种模式,在这种模式中,我可以保存消息,不仅应用它们,还可以撤消它们,就像用于实现此功能的 我的第一种方法是:使用

在Java中,我在套接字上收到一个类的对象:
MyInterProcessMessageProto
。从这里,我可以非常容易地获取数据,因为它们彼此封装在一起:
myMessage.getEventA().getName()

我面临两个问题:

  • 如何委托处理接收到的消息

    因为,分析整个消息并区分不同的事件类型以及它们所暗示的操作,导致了一个庞大且不可维护的方法,其中包含许多if案例

  • 我想找到一种模式,在这种模式中,我可以保存消息,不仅应用它们,还可以撤消它们,就像用于实现此功能的

  • 我的第一种方法是:使用指定的
    apply()
    undo()
    方法为每个事件创建不同的包装器类,并以这种方式委托作业

    然而,我不确定这是否是正确的方法,也不确定是否有更好的解决办法


    为了澄清我的申请:

    Java应用程序对运行中的Java虚拟机进行建模,并保存信息,例如线程、监视器、内存等

    每个事件都会更改建模JVM的当前状态。例如,一个新线程被启动,另一个线程进入阻塞状态,内存被释放,等等。同样,事件被建模:ThreadEvent,MemoryEvent,等等

    这意味着,必须按顺序处理消息。为了迭代回到JVM以前的状态,我想实现这个撤销功能

    我已经试过了。ClearAllState,在事件i之前应用事件


    不幸的是,对于20.000多个事件,这完全是低效的。

    要提供定制的答案,最好了解您正在对接收到的消息执行什么操作,它们是否可以同时处理,以及撤消操作如何影响在收到消息和撤消消息后接收到的消息的处理

    然而,这里有一个通用的建议:一种典型的方法是将接收到的消息委托给处理程序类,该类通常在自己的线程中运行(以便让消息接收方尽快准备好接收下一个传入消息),并按顺序处理接收到的消息。为了实现撤销功能,您可以使用类来跟踪已处理的消息。您还可以为不同的事件类型使用特定的队列和堆栈


    基本上这类似于。

    Sonne:你说得对,我在问题的最后澄清了我的申请。不过,还是要谢谢你的建议。