📅  最后修改于: 2023-12-03 14:57:40.100000             🧑  作者: Mango
命令模式(Command Pattern)是一种行为型设计模式,它将请求封装为一个对象,从而使不同的请求可以对客户端进行参数化。
简而言之,命令模式可以将请求(即命令)与其执行者进行解耦,并且将请求封装成对象,以便于对请求进行参数化、队列化、记录日志、撤销等操作。
命令模式由以下组成部分:
Command(命令):是一个接口,它规定了命令对象的基本行为。通常它包含一个execute()
方法,当调用这个方法时,命令对象会完成相应的操作。
Concrete Command(具体命令):是一个实现了Command
接口的具体类,它负责执行实际的操作。
Invoker(调用者):它负责发出请求并调用命令对象执行请求。
Receiver(接收者):负责执行命令对象指定的操作。
Client(客户端):负责创建命令对象并将其传递给调用者执行。
命令模式的优点包括:
松耦合:命令模式将命令和接收者完全解耦,使得两者之间的关联关系减少,从而更好地满足了“开放-封闭原则”。
可扩展性:客户端通过调用Invoker的setCommand()
方法传递不同的命令对象,使得系统更加灵活。
可撤销:命令模式可以将命令对象进行队列化,从而可以实现撤销操作。
记录日志:命令模式可以记录所有执行过的命令,便于调试。
命令模式通常适用于以下场景:
执行命令的地方需要与命令的具体实现分离,使得这些具体实现可以更加容易地进行扩展。
需要队列化、日志记录、撤销操作等功能。
需要异步执行命令,例如可以将具体命令发送到远程服务器执行。
以下是一个简单的Java代码示例,它演示了如何使用命令模式实现一个遥控器:
// 创建Receiver
class Light {
public void on() {
System.out.println("Light is on");
}
public void off() {
System.out.println("Light is off");
}
}
// 创建Command接口
interface Command {
void execute();
}
// 创建Concrete Command
class LightOnCommand implements Command {
private Light light;
public LightOnCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.on();
}
}
class LightOffCommand implements Command {
private Light light;
public LightOffCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.off();
}
}
// 创建Invoker
class RemoteController {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void executeCommand() {
command.execute();
}
}
// 创建Client
public class Client {
public static void main(String[] args) {
// 创建Receiver
Light light = new Light();
// 创建Concrete Command
Command lightOnCommand = new LightOnCommand(light);
Command lightOffCommand = new LightOffCommand(light);
// 创建Invoker
RemoteController remote = new RemoteController();
remote.setCommand(lightOnCommand);
remote.executeCommand();
remote.setCommand(lightOffCommand);
remote.executeCommand();
}
}