Java 此场景的命令模式?建议

Java 此场景的命令模式?建议,java,command-pattern,Java,Command Pattern,大家晚上好。我一直在阅读命令模式,我想知道它是否适合我想要构建的东西 本质上,我有一个客户端,它与服务器形成套接字连接。我的服务器上有一个类“foo”,客户端需要对其调用方法 假设foo有5个我的客户机将调用的方法。在过去,我犯了一个错误,即对服务器上解组的对象进行编组。然后我检查对象中的一个变量,并使用switch语句,服务器逻辑可以确定应该调用什么操作 我希望避免这种情况,因此我相信命令模式可能会对我有所帮助。但是,对于服务器上的示例“foo”类,是否需要为要在foo中调用的每个方法创建一个

大家晚上好。我一直在阅读命令模式,我想知道它是否适合我想要构建的东西

本质上,我有一个客户端,它与服务器形成套接字连接。我的服务器上有一个类“foo”,客户端需要对其调用方法

假设foo有5个我的客户机将调用的方法。在过去,我犯了一个错误,即对服务器上解组的对象进行编组。然后我检查对象中的一个变量,并使用switch语句,服务器逻辑可以确定应该调用什么操作

我希望避免这种情况,因此我相信命令模式可能会对我有所帮助。但是,对于服务器上的示例“foo”类,是否需要为要在foo中调用的每个方法创建一个命令类?从客户端发送到服务器的类是否应该是命令类?在这种情况下,我只需要一个接收器吗?-福课

非常感谢您的帮助,对这里的“foo”类名感到抱歉。我还没有得到任何具体的类名


致以最诚挚的问候

无论您做什么,都无法完全摆脱switch()语句。命令模式建议您执行以下操作:

abstract class AbstractCommand() {
  abstract void execute();
}
class ConcreteCommand extends AbstractCommand {
  // execute implementation
}
// more command classes as needed; probably one per each of your method calls
然后您有一个命令工厂:

class CommandFactory {
  AbstractCommand createCommandForMessage(Message m) {
    // ... switch() goes here
  }
}
您的消息接收部分变得如此简单:

public class MessageReceiver {
  public void work() {
    while (true) {
      Message m = receiveMessage();
      AbstractCommand command = commandFactory.createCommandForMessage(m);
      command.execute();
    }
  }
}

这样做的好处在于,您可以将命令的实际逻辑(execute()方法实现)与决定使用哪个命令的逻辑以及知道如何在网络上接收消息的逻辑清晰地分开。

您的键盘上有“Shift”或“Caps Lock”键吗?我在iphone上写,为什么?因为如果你想让别人认真对待你的问题,写以大写字母开头的恰当句子(以及写“I”)是很重要的。你好,谢谢你的回答。我认为(从我读到的)命令模式消除了对开关或多个else/if条件逻辑的需要。另外,我不太确定我是否遵循您在这里使用的cCommand工厂。你能解释一下吗,因为它似乎不同于我读过的关于命令模式的其他示例。再次感谢。另外,作为客户端通过套接字调用服务器操作的一种方式,命令模式是合适的选择吗?感谢您无法完全消除switch():根据您接收的数据包类型,您需要以不同的方式处理它。例如,你可以使用地图,但从逻辑上讲,它仍然是一样的。CommandFactory是这个开关()实际发生的地方,因此您的代码被清晰地分成3部分:1。消息接收器,2。命令创建者和3。命令逻辑。我过去在套接字通信中使用过这种模式,并且发现它灵活且易于扩展,所以我推荐它。您没有调用将发送方和接收方解耦的调用程序