一、概述
命令模式是一种行为型设计模式,它将请求封装成一个对象,使得请求的发送者和接收者解耦。这样可以通过不同的命令对象来参数化不同的请求,从而实现请求的参数化、队列化、撤销等操作。
二、代码
以下是一个示例代码,说明命令模式的使用:
//1.命令接口
public interface Command {
//执行命令
void execute();
//撤销命令
void undo();
}
//2.具体命令类:加法命令
public class AddCommand implements Command {
private Calculator calculator;
//操作的数值
private int operand;
public AddCommand(Calculator calculator, int operand) {
this.calculator = calculator;
this.operand = operand;
}
public void execute() {
calculator.add(operand);
}
public void undo() {
calculator.subtract(operand);
}
}
//3.具体命令类:减法命令
public class SubtractCommand implements Command {
private Calculator calculator;
//操作的数值
private int operand;
public SubtractCommand(Calculator calculator, int operand) {
this.calculator = calculator;
this.operand = operand;
}
public void execute() {
calculator.subtract(operand);
}
public void undo() {
calculator.add(operand);
}
}
//4.接收者类:计算器
public class Calculator {
private int result = 0;
public void add(int value) {
result += value;
System.out.println("Result: " + result);
}
public void subtract(int value) {
result -= value;
System.out.println("Result: " + result);
}
}
//5.调用者类:计算器控制器
public class CalculatorController {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void executeCommand() {
command.execute();
}
public void undoCommand() {
command.undo();
}
}
//6.测试类
public class Test {
public static void main(String[] args) {
// 创建接收者对象
Calculator calculator = new Calculator();
// 创建具体命令对象并关联接收者对象
Command addCommand = new AddCommand(calculator, 5);
Command subtractCommand = new SubtractCommand(calculator, 3);
// 创建调用者对象并设置命令
CalculatorController controller = new CalculatorController();
// 执行加法命令
controller.setCommand(addCommand);
controller.executeCommand();
// 执行减法命令
controller.setCommand(subtractCommand);
controller.executeCommand();
// 撤销减法命令
controller.undoCommand();
}
}
在上述代码中,我们创建了一个 CalculatorController
类作为调用者对象,它有一个 Command
成员变量用于保存当前的命令。executeCommand()
方法用于执行命令,而 undoCommand()
方法用于撤销命令。
当我们调用 executeCommand()
方法时,调用者对象会执行命令的 execute()
方法,从而调用接收者对象的相应操作方法。
当我们调用 undoCommand()
方法时,调用者对象会执行命令的 undo()
方法,从而撤销之前执行的命令。