Internet上的示例,例如here,让我对Command
模式感到困惑。在大多数示例中,具体命令直接调用接收者的方法之一。这是具体指挥的唯一责任吗?实际业务逻辑属于哪里?在具体命令的execute()
方法中还是在接收器上的某种方法中?
另一个问题是,如果我们想要实现多线程命令模式,我们的线程池应该从Invoker
接收命令并运行具体命令的execute()
方法?我的理解是否正确?
答案 0 :(得分:1)
两者都是可能的,并且我已经在简单的应用程序中使用包含命令实现的具体命令来实现Command,但是,在典型的大型应用程序中,命令只需传达命令类型和任何命令。参数。由接收者来控制或委托行为的实施。
这是因为客户端必须依赖于具体的命令。如果具体命令反过来需要复杂的依赖关系来实现行为,那么客户端间接依赖于那些复杂的依赖关系,这会导致系统不稳定。相反,具体的命令应该没有复杂的依赖关系,因此客户可以毫无顾虑地依赖它们。
[我忽略了你的第二个问题。请将其移至新问题,以便我们单独回答。]
答案 1 :(得分:1)
业务逻辑在于 Receiver (大多数逻辑)和 ConcreteCommand (某些逻辑)类。
客户致电推荐人 => 邀请者致电 ConcreteCommand => ConcreteCommand 调用 Receiver 方法,该方法实现了抽象命令方法。
优势:客户端不受命令和接收器的影响。 Invoker在客户端和接收者之间提供松耦合。您可以使用相同的Invoker运行多个命令。
您在线程方面的理解是正确的。您可以将 ExecutorService 视为 Invoker 和 Runnable 或 Callable 作为 Runnable <的抽象命令和实现类/ strong>或可调用为具体命令/接收器。我看到 ConcreteCommand 本身在简单的多线程应用程序中扮演 Receiver 的角色。
看看这个问题以便更好地理解: