一、模式介绍
命令模式的作用在于将请求的调用者与请求的处理者松耦合,进而使得调用者不必再关心请求的执行细节(如被谁执行的,怎么执行的等等),调用者和处理者可以自由变化。
实现方案:声明一个命令调用接口,客户端使用该接口中声明的命令统一执行方式执行命令,在具体命令的实现中查找并使用真实处理者中的具体方法。
另外,通过命令执行者的介入,可以方便地实现,历史命令记录、取消命令执行(undo)、重新执行命令(redo)、批量执行等等。
二、原理图

三、示例代码
import java.util.ArrayList;
import java.util.List;
interface ComputerCommand {
void execute();
// undo execute
}
// Receiver
class Computer {
void startup() {
System.out.println("开机 ...");
}
void shutdown() {
System.out.println("关机 ...");
}
void restart() {
System.out.println("重启 ...");
}
}
class StartupCommand implements ComputerCommand {
Computer computer;
public StartupCommand(Computer computer) {
this.computer = computer;
}
@Override
public void execute() {
computer.startup();
}
}
class ShutdownCommand implements ComputerCommand {
Computer computer;
public ShutdownCommand(Computer computer) {
this.computer = computer;
}
@Override
public void execute() {
computer.shutdown();
}
}
class RestartCommand implements ComputerCommand {
Computer computer;
public RestartCommand(Computer computer) {
this.computer = computer;
}
@Override
public void execute() {
computer.restart();
}
}
// Invoker:可实现 undo redo 等等
class CommandInvoker {
List historyCommands = new ArrayList();
void storeAndExecute(ComputerCommand command) {
historyCommands.add(command);// 记录,可实现 undo redo 等等
command.execute();
}
}
public class Test {
public static void main(String[] args) {
Computer computer = new Computer();
CommandInvoker invoker = new CommandInvoker();
invoker.storeAndExecute(new StartupCommand(computer));
invoker.storeAndExecute(new RestartCommand(computer));
invoker.storeAndExecute(new ShutdownCommand(computer));
}
}
输出结果:
开机 ...
重启 ...
关机 ...