一、简介
命令模式(Command Pattern)是一种行为设计模式,它允许将请求或操作封装为一个单独的对象。这种模式允许参数化方法调用,将方法调用、请求或操作封装成一个对象,从而可以在不同的时间将请求排队、记录请求日志、撤销操作等。
命令模式的核心思想是将请求封装成一个对象,使得请求的发送者和接收者解耦。发送者只需知道如何发送命令,并不需要知道接收者如何处理命令、何时执行命令以及具体的命令细节。这种模式通常包含以下关键角色:
- 命令(Command): 定义了执行操作的接口,包含了执行命令的方法。
- 具体命令(Concrete Command): 实现了命令接口,负责执行具体的操作。
- 接收者(Receiver): 知道如何执行与请求相关的操作。
- 调用者/客户端(Invoker/Client): 负责创建命令对象,并指定命令的接收者。
通过使用命令模式,可以实现命令的撤销、重做、记录日志、批处理等功能,同时提供了更加灵活的命令处理方式。
二、命令模式
假设我们有一个遥控车(Receiver),并使用命令模式来模拟遥控器发送命令控制遥控车的移动。
2.1、命令接口
// 命令接口
public interface Command {
void execute();
}
2.2、具体命令
// 具体命令 - 向前移动
public class MoveForwardCommand implements Command {
private Car car;
public MoveForwardCommand(Car car) {
this.car = car;
}
@Override
public void execute() {
car.moveForward();
}
}
// 具体命令 - 向后移动
public class MoveBackwardCommand implements Command {
private Car car;
public MoveBackwardCommand(Car car) {
this.car = car;
}
@Override
public void execute() {
car.moveBackward();
}
}
2.3、接收者
// 接收者 - 遥控车
public class Car {
public void moveForward() {
System.out.println("汽车向前移动");
}
public void moveBackward() {
System.out.println("汽车向后移动");
}
}
2.4、调用者
// 调用者 - 遥控器
public class RemoteControl {
private Command forwardCommand;
private Command backwardCommand;
public RemoteControl(Command forwardCommand, Command backwardCommand) {
this.forwardCommand = forwardCommand;
this.backwardCommand = backwardCommand;
}
public void pressForwardButton() {
forwardCommand.execute();
}
public void pressBackwardButton() {
backwardCommand.execute();
}
}
2.5、使用
// 测试类
public class RemoteControlCarExample {
public static void main(String[] args) {
Car car = new Car();
Command moveForwardCommand = new MoveForwardCommand(car);
Command moveBackwardCommand = new MoveBackwardCommand(car);
RemoteControl remoteControl = new RemoteControl(moveForwardCommand, moveBackwardCommand);
remoteControl.pressForwardButton();
remoteControl.pressBackwardButton();
}
}
运行结果:
汽车向前移动
汽车向后移动
三、优点与缺点
命令模式有以下优点和缺点:
优点
- 松耦合: 命令模式将请求发送者和接收者解耦,发送者不需要知道接收者的具体实现,只需知道如何发送命令。
- 可扩展性: 可以方便地添加新的命令或修改现有命令,而无需修改调用者的代码。
- 撤销和恢复操作: 可以轻松实现命令的撤销和重做操作,因为命令对象可以存储操作的状态。
- 记录日志和审计: 可以记录命令的执行历史,用于日志记录、审计等场景。
缺点
- 类爆炸: 如果系统中有大量的命令,可能会导致命令类的数量急剧增加,造成类爆炸。
- 增加复杂性: 引入命令模式会增加额外的类和对象,可能会增加系统复杂性,特别是对于简单的命令操作而言。
- 命令的具体实现: 每个具体命令都需要一个具体的实现类,如果命令逻辑较为简单,会导致类的数量增加。
尽管命令模式有一些缺点,但它仍然是一种有用的设计模式,特别是当需要实现撤销、重做、日志记录等功能时,命令模式可以提供一种简洁而可靠的解决方案。