命令模式是一种行为设计模式,它将请求或简单操作封装为一个对象。这种模式允许用户通过调用对象来参数化其他对象的方法,并能保存、排队和执行方法调用。
概念
- 命令(Command):定义执行操作的接口。
- 具体命令(Concrete Command):实现命令接口,并调用接收者的操作。
- 调用者(Invoker):要求命令对象执行请求。
- 接收者(Receiver):知道如何实施与执行一个请求相关的操作。
- 客户(Client):创建具体命令对象并设置其接收者。
优点
- 降低系统的耦合度:调用者和接收者之间无需知道彼此的实现细节。
- 增加新的命令类很容易:扩展性好,符合开闭原则。
- 可以实现撤销和重做功能:通过保存命令历史来实现。
缺点
- 可能会导致某些系统有过多的具体命令类:每个操作都需要设计一个具体命令类,可能会增加系统的复杂性。
- 增加了系统的抽象层次:引入了许多新的类,理解系统的难度可能会增加。
Java代码示例
假设我们有一个简单的遥控器(调用者),可以执行设备(接收者)的开和关操作。下面是如何使用命令模式实现这个功能:
java复制代码
// 命令接口
interface Command {
void execute();
}
// 具体命令:开灯
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();
}
}
// 接收者
class Light {
public void on() {
System.out.println("Light is on");
}
public void off() {
System.out.println("Light is off");
}
}
// 调用者
class RemoteControl {
private Command onCommand;
private Command offCommand;
public void setCommands(Command onCommand, Command offCommand) {
this.onCommand = onCommand;
this.offCommand = offCommand;
}
public void pressOnButton() {
onCommand.execute();
}
public void pressOffButton() {
offCommand.execute();
}
}
// 客户端代码
public class CommandPatternDemo {
public static void main(String[] args) {
RemoteControl remote = new RemoteControl();
Light light = new Light();
Command lightsOn = new LightOnCommand(light);
Command lightsOff = new LightOffCommand(light);
remote.setCommands(lightsOn, lightsOff);
remote.pressOnButton();
remote.pressOffButton();
}
}
在这个例子中,LightOnCommand
和 LightOffCommand
是具体的命令类,Light
是接收者,RemoteControl
是调用者。客户端创建了具体的命令对象,并设置了它们的接收者,然后将这些命令对象传递给调用者对象。调用者对象通过执行这些命令来操作接收者。