命令模式:分离操作与调用对象
通过使用命令模式,您可以将操作与调用对象分离开来。正因如此,在不更改调用者的情况下更改命令变得更加容易。
这意味着在以下情况下您可以使用命令模式:
- 您希望参数化对象以执行操作
- 您希望在不同时间指定、执行和排队请求
快速入门
您需要一个命令对象,在这种情况下使用接口可以使其易于扩展,例如扩展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);
}
|