通过Command设计模式,我理解我们需要通过构造函数设置上下文,然后调用execute方法对上下文执行一些操作来创建Command。例:

public class Command implements ICommand {

    Device device;

    public Command(Device device) {
        this.device = device;
    }

    public void execute() {
        this.device.turnOn()
    }
}


我想知道使用这种方法是否需要为我们创建的每个设备对象创建一个新的Command对象。将上下文和一些参数传递给execute方法可以吗?我正在寻找类似的东西:

public class Command implements ICommand {

    public void execute(Device device) {
        this.device.turnOn();
    }

}


这种方法有什么问题吗?

最佳答案

Command模式背后的想法是,它应该封装执行动作所需的所有信息。这使您可以执行诸如将动作的执行延迟到以后的时间,甚至在执行动作后撤消动作的操作。

对于一个具体的示例,请考虑文字处理器中的“撤消”功能。每次您键入文档时,应用程序都会使用“命令”模式来记录操作。如果您单击“撤消”,您的键入将被删除。然后,当您单击“重做”时,应用程序将重播操作,而无需再次要求输入。它存储的命令封装了有关您键入的文本的所有信息。

如果您的命令对象需要其他参数才能执行操作,则它实际上不会实现命令模式。它失去了Command模式的大多数优点,因为调用者在没有其他信息的情况下无法执行操作。在您的示例中,呼叫者将需要知道打开了哪个设备。

但是,这并不意味着您必须严格遵循模式。如果execute方法接受Device参数对您而言更有用,那就是您应该做的!如果这样做,则应考虑重命名接口。如果不完全遵循命令模式,则将其称为命令模式可能会使其他代码阅读者感到困惑。

在决定将对象作为方法参数还是构造函数参数时,我发现最有帮助的事情之一就是考虑如何测试应用程序。构成测试初始设置一部分的对象将作为构造函数参数传入,而构成测试输入或测试向量的对象则是方法参数。我发现遵循该准则有助于生成可维护的代码。

关于java - 在命令设计模式中将上下文传递给execute方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50909071/

10-11 22:28
查看更多