核心思想
封装请求:
将请求的每一个部分封装到一个独立的命令对象中;
解耦调用者
和接收者
:
调用者只需要知道如何调用命令对象,而不需要了解如何处理请求;
可扩展性:
可以很容易地增加新的命令。
优点
解耦:将请求的发送者和接收者解耦。
扩展性:可以很容易地增加新的命令。
支持撤销和恢复操作:如果实现了相应的逻辑,命令可以被撤销或重做。
缺点
类的数量增加:每个命令都需要一个具体的类,这可能导致类的数量增加。
Example
假设你在设计一个遥控器,它可以控制电视开关、音量等操作:
- 命令接口:Command
- 具体命令:TurnOnCommand, TurnOffCommand
- 调用者:RemoteControl
- 接收者:Television
下面是一个使用命令模式设计遥控器的Java示例。
接口和类定义
1. 命令接口
public interface Command {
void execute();
void undo();
}
2. 具体命令类
public class TurnOnCommand implements Command {
private Television tv;
public TurnOnCommand(Television tv) {
this.tv = tv;
}
@Override
public void execute() {
tv.turnOn();
}
@Override
public void undo() {
tv.turnOff();
}
}
public class TurnOffCommand implements Command {
private Television tv;
public TurnOffCommand(Television tv) {
this.tv = tv;
}
@Override
public void execute() {
tv.turnOff();
}
@Override
public void undo() {
tv.turnOn();
}
}
3. 接收者类
public class Television {
public void turnOn() {
System.out.println("Television is ON");
}
public void turnOff() {
System.out.println("Television is OFF");
}
}
4. 调用者类
public class RemoteControl {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void pressButton() {
command.execute();
}
public void pressUndo() {
command.undo();
}
}
使用示例
public class Main {
public static void main(String[] args) {
Television tv = new Television();
Command turnOn = new TurnOnCommand(tv);
Command turnOff = new TurnOffCommand(tv);
RemoteControl remote = new RemoteControl();
remote.setCommand(turnOn);
remote.pressButton(); // 输出: Television is ON
remote.pressUndo(); // 输出: Television is OFF
remote.setCommand(turnOff);
remote.pressButton(); // 输出: Television is OFF
remote.pressUndo(); // 输出: Television is ON
}
}
说明
- Command接口:定义了
execute
和undo
方法。 - 具体命令类:
TurnOnCommand
和TurnOffCommand
实现了Command
接口。 - 接收者类:
Television
,包含turnOn
和turnOff
方法。 - 调用者类:
RemoteControl
,允许设置命令并执行或撤销。
这样就实现了一个简单的遥控器案例,能够打开和关闭电视,并支持撤销操作。