命令模式将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。Lambda 表达式可以很好地实现命令模式中命令的定义。我们来看一个例子:
假设我们有一个遥控器,可以对电视执行各种命令。这是一个使用命令模式的很好示例。
使用 Lambda 表达式实现命令模式:
// 命令接口
@FunctionalInterface
interface Command {
void execute();
}
// 具体的命令实现
Command turnOn = () -> System.out.println("电视机开机");
Command turnOff = () -> System.out.println("电视机关机");
// 遥控器
class RemoteControl {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void pressButton() {
command.execute();
}
}
// 使用场景
RemoteControl control = new RemoteControl();
control.setCommand(turnOn);
control.pressButton(); // 电视机开机
control.setCommand(turnOff);
control.pressButton(); // 电视机关机
这里 Command 接口表示命令,turnOn 和 turnOff 是两种具体的命令实现,使用 Lambda 表达式实现。RemoteControl 是遥控器,可以设置和执行命令。
我们可以通过为 RemoteControl 设置不同的 Command 来选择执行不同的操作,这体现了命令模式的关键思想。