Java学设计模式之命令模式
一、命令模式概念
1.1 什么是命令模式
命令模式是一种行为型设计模式,它允许将请求封装成一个对象,从而使得可以用不同的请求对客户端参数化,并且能够对请求排队或记录请求日志,以及支持可撤销的操作。
结构
命令模式通常包含以下几个要素:
-
Command(命令): 定义了执行操作的接口,通常包含一个执行操作的方法(比如
execute())。 -
ConcreteCommand(具体命令): 实现了命令接口的具体命令类,包含了对接收者的引用以及具体的执行操作。
-
Invoker(调用者): 负责调用命令对象执行请求的对象。
-
Receiver(接收者): 知道如何执行与请求相关的操作,任何类都可能作为一个接收者。
-
Client(客户端): 创建具体的命令对象并设置其接收者,然后将命令对象传递给调用者。
二、命令模式代码
2.1 命令
public interface Command {
void execute();
}
2.2 具体命令
public class TurnOnCommand implements Command {
private TV tv;
TurnOnCommand(TV tv) {
this.tv = tv;
}
@Override
public void execute() {
tv.turnOn();
}
}
public class TurnOffCommand implements Command{
private TV tv;
TurnOffCommand(TV tv) {
this.tv = tv;
}
@Override
public void execute() {
tv.turnOff();
}
}
public class VolumeUpCommand implements Command {
private TV tv;
VolumeUpCommand(TV tv) {
this.tv = tv;
}
@Override
public void execute() {
tv.volumeUp();
}
}
2.3 接收者
public class TV {
void turnOn() {
System.out.println("电视已打开");
}
void turnOff() {
System.out.println("电视已关闭");
}
void volumeUp() {
System.out.println("音量增加");
}
}
2.4 调用者
public class RemoteControl {
private Command command;
void setCommand(Command command) {
this.command = command;
}
void pressButton() {
command.execute();
}
}
2.5 测试类
public class CommandPatternTest {
public static void main(String[] args) {
TV tv = new TV();
RemoteControl remoteControl = new RemoteControl();
TurnOnCommand turnOnCommand = new TurnOnCommand(tv);
TurnOffCommand turnOffCommand = new TurnOffCommand(tv);
VolumeUpCommand volumeUpCommand = new VolumeUpCommand(tv);
remoteControl.setCommand(turnOnCommand);
remoteControl.pressButton();
remoteControl.setCommand(volumeUpCommand);
remoteControl.pressButton();
remoteControl.setCommand(turnOffCommand);
remoteControl.pressButton();
// 输出:
// 电视已打开
// 音量增加
// 电视已关闭
}
}
三、总结
命令模式的优点包括:
- 解耦了调用者和接收者,调用者不需要知道接收者的具体实现细节。
- 可以轻松地新增、删除或者更换命令,而不影响其他部分的代码。
缺点包括:
- 可能会产生大量的具体命令类,特别是当有很多不同的操作需要支持时。
- 对于简单的命令,可能会显得过于繁琐。

浙公网安备 33010602011771号