深入理解命令模式:分离操作与调用对象

本文详细介绍了命令设计模式的核心概念及其在Java中的实现方式,通过接口定义、具体命令类和命令管理器展示了如何将操作与调用对象解耦,支持参数化对象和请求的灵活调度。

命令模式:分离操作与调用对象

通过使用命令模式,您可以将操作与调用对象分离开来。正因如此,在不更改调用者的情况下更改命令变得更加容易。

这意味着在以下情况下您可以使用命令模式:

  • 您希望参数化对象以执行操作
  • 您希望在不同时间指定、执行和排队请求

快速入门

您需要一个命令对象,在这种情况下使用接口可以使其易于扩展,例如扩展Swing MenuItem或Button等其他类。

下面的execute方法是在调用此命令或要求其执行操作时调用的方法。而getCommandName被假定为唯一名称,但我相信我们总能想出更好的实现来确保唯一性。

1
2
3
4
public interface Command {
    public void execute();
    public String getCommandName();
}

命令的示例实现应如下所示:一个命令名称和一个execute方法,用于说明调用此命令时会发生什么。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
public class ForwardCmd implements Command {

    private String COMMAND_NAME = "Back";

    public BackCmd() {
        super();
    }

    public String getCommandName() {
        return COMMAND_NAME;
    }

    public void execute() {
        System.out.println("Your wish, my command");
    }
}

命令管理器

在这种情况下,命令管理器是控制器。它注册命令对象。“registerCommand"将简单地接受一个命令并将其存储在列表或类似结构中。这意味着您可以从jar文件、xml或路径中加载它,并将对象作为命令传递给"registerCommand”。

“execute"命令将简单地执行传递给它的命令。而"getCommand"通过查找COMMAND_NAME返回一个命令。因此,如果您通过系统向其提供名称,它应该给您一个Command类型的对象,并简单地将其传递给execute。同样,这将是控制器逻辑而不是客户端逻辑。

1
2
3
4
5
6
7
public abstract class AbstractCommandManager {

    public abstract void registerCommand(Command command);
    public abstract Collection getAllCommands();
    public abstract void execute(Command command);
    public abstract Command getCommand(String name);
}
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计