将上下文传递给命令设计模式

时间:2018-06-18 12:00:38

标签: java design-patterns

通过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();
    }

}

这种方法有什么问题吗?

1 个答案:

答案 0 :(得分:4)

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

举一个具体的例子,考虑"撤消"文字处理器中的功能。每次键入文档时,应用程序都使用命令模式记录操作。如果您点击"撤消",则会删除您的输入。然后,当您点击"重做"时,应用程序将重放该操作,而无需再次请求输入。它存储的命令封装了您键入的文本的所有信息。

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

但是,这并不意味着你必须严格坚持这种模式。如果您的execute方法接受Device参数更有用,那么您应该做些什么!如果这样做,您应该考虑重命名界面。将它称为命令模式,当它没有完全遵循模式时,可能会混淆代码的其他读者。

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