命令模式是一种行为型设计模式,它将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,同时将请求排队或记录请求日志,以及支持可撤销的操作。命令模式使得请求的发送者(Invoker)和请求的接收者(Receiver)解耦,让请求可以被队列、记录日志、撤销等。
命令模式中通常包含以下几个角色:
-
命令(Command):命令是一个接口,该接口定义了执行命令的方法。
-
具体命令(ConcreteCommand):具体命令类实现了命令接口,在具体命令中绑定了一个接收者和一组动作。
-
接收者(Receiver):接收者是一个类,执行具体的命令。
-
调用者(Invoker):调用者是一个类,它可以接收并执行命令,并且可以支持命令的撤销操作。
下面以Java为例,说明命令模式的具体使用:
命令接口:
public interface Command {
public void execute();
}
具体命令类:
public class ConcreteCommandA implements Command {
private Receiver receiver;
public ConcreteCommandA(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
receiver.actionA();
}
}
public class ConcreteCommandB implements Command {
private Receiver receiver;
public ConcreteCommandB(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
receiver.actionB();
}
}
接收者类:
public class Receiver {
public void actionA() {
System.out.println("接收者执行actionA操作");
}
public void actionB() {
System.out.println("接收者执行actionB操作");
}
}
调用者类:
public class Invoker {
private Command command;
public Invoker(Command command) {
this.command = command;
}
public void setCommand(Command command) {
this.command = command;
}
public void executeCommand() {
command.execute();
}
}
客户端代码:
public class Client {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command commandA = new ConcreteCommandA(receiver);
Command commandB = new ConcreteCommandB(receiver);
Invoker invoker = new Invoker(commandA);
invoker.executeCommand();
invoker.setCommand(commandB);
invoker.executeCommand();
}
}
在这个例子中,Command是一个接口,ConcreteCommandA和ConcreteCommandB是具体命令类,Receiver是接收者类,Invoker是调用者类。当客户端(Client)执行命令时,它实际上是将一个具体的命令对象传递给调用者(Invoker)对象,并且调用者(Invoker)对象执行该命令。
命令模式的主要作用是将请求者和接收者解耦。它可以将请求封装成一个对象并进行各种操作,例如记录请求日志、异步处理请求等。另外,命令模式还支持撤销、排队等一系列操作,可以大大增加系统的灵活性。适用于以下场景:
-
当需要抽象出需要执行的动作并将其作为参数进行传递时。
-
当需要支持撤销操作时。
-
当需要将多个操作封装为一个对象并进行统一操作时