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 在命令设计模式中将上下文传递给execute方法_Java_Design Patterns - Fatal编程技术网

Java 在命令设计模式中将上下文传递给execute方法

Java 在命令设计模式中将上下文传递给execute方法,java,design-patterns,Java,Design Patterns,通过查看命令设计模式,我了解到我们需要通过构造函数设置上下文,然后调用execute方法在上下文上执行一些操作来创建命令。例如: public class Command implements ICommand { Device device; public Command(Device device) { this.device = device; } public void execute() { this.device.

通过查看命令设计模式,我了解到我们需要通过构造函数设置上下文,然后调用execute方法在上下文上执行一些操作来创建命令。例如:

public class Command implements ICommand {

    Device device;

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

    public void execute() {
        this.device.turnOn()
    }
}
我想知道,使用这种方法,我们将需要为我们创建的每个设备对象创建一个新的命令对象。将上下文和一些参数传递给execute方法可以吗?我正在寻找类似于:

public class Command implements ICommand {

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

}

这种方法有什么问题吗?

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

一个具体的例子,考虑字处理器中的“撤消”特性。

  • 每次键入文档时,应用程序都使用命令模式记录操作
  • 如果点击“撤消”,您键入的文本将消失
  • 然后,当您点击“重做”时,键入的文本将重新出现,而应用程序无需再次请求输入。它通过重放存储在步骤1中的命令来实现这一点,该命令包含有关键入文本的所有信息
  • 如果您的命令对象需要额外的参数来执行操作,那么它实际上并没有实现命令模式。它失去了命令模式的大部分优点,因为调用方无法在没有附加信息的情况下执行操作。在您的示例中,调用方需要知道正在打开哪个设备

    然而,这并不意味着你必须严格遵守这个模式。如果在您的情况下,
    execute
    方法接受
    设备
    参数更有用,那么您应该这样做!如果你这样做,你应该考虑重命名该接口。当它不完全遵循命令模式时,将其称为命令模式可能会混淆代码的其他读者


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