命令设计模式
命令模式
- 命令模式定义:
- 使用场景
- 1、遥控器:遥控器是一种典型的命令模式应用,遥控器中的每一个按钮都对应着一个命令对象,当用户按下按钮时,遥控器会发送相应的命令对象给电器,电器会根据命令对象来执行相应的操作。
- 2、厨师和服务员:在餐厅中,厨师和服务员之间的关系可以看作是一种命令模式。服务员负责接收顾客的点餐请求,将请求封装成一个命令对象,并将命令对象发送给厨师。厨师会根据命令对象来烹饪相应的菜品,完成后将菜品交给服务员。
- 3、智能家居:智能家居系统中,用户可以通过手机或者语音控制设备的开关、调节亮度等操作。这些操作都可以看作是命令对象,当用户发送一个命令对象时,智能家居系统会根据命令对象来控制相应的设备。
- 4、播放器:在音乐或者影视播放器中,用户可以通过命令对象来控制音乐或者影片的播放、暂停、快进等操作。播放器会根据命令对象来执行相应的操作。
- 角色定义
- Receive 接收者角色
- Command 命令角色
- lnvoker 调用者角色
- 需求背景
- 1、定义接收者角色 Receiver,包含电视机的操作方法,如开关、音量和频道控制等。
- 2、定义命令接口 Command,包含执行命令的方法 execute()。
- 3、定义具体命令类 ConcreteCommand,实现 Command 接口,包含一个接收者对象和一个执行命令的方法 execute(),在执行命令时调用接收者对象的相应方法。
- 4、定义调用者角色 Invoker,包含一个命令对象和一个执行命令的方法 executeCommand(),在执行命令时调用命令对象的 execute() 方法。
- 5、编写测试案例,创建一个遥控器对象和一个电视机对象,分别创建开机、关机、调节频道和音量的命令对象,并将命令对象设置到遥控器对象中,最后执行遥控器对象的执行命令方法。
- 6、输出结果
- 7、总结
命令模式定义:
将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化
使用场景
1、遥控器:遥控器是一种典型的命令模式应用,遥控器中的每一个按钮都对应着一个命令对象,当用户按下按钮时,遥控器会发送相应的命令对象给电器,电器会根据命令对象来执行相应的操作。
2、厨师和服务员:在餐厅中,厨师和服务员之间的关系可以看作是一种命令模式。服务员负责接收顾客的点餐请求,将请求封装成一个命令对象,并将命令对象发送给厨师。厨师会根据命令对象来烹饪相应的菜品,完成后将菜品交给服务员。
3、智能家居:智能家居系统中,用户可以通过手机或者语音控制设备的开关、调节亮度等操作。这些操作都可以看作是命令对象,当用户发送一个命令对象时,智能家居系统会根据命令对象来控制相应的设备。
4、播放器:在音乐或者影视播放器中,用户可以通过命令对象来控制音乐或者影片的播放、暂停、快进等操作。播放器会根据命令对象来执行相应的操作。
角色定义
Receive 接收者角色
该角色就是干活的角色,命令传递到这里是应该被执行的。
Command 命令角色
需要执行的所有命令都在这里声明.
lnvoker 调用者角色
接收到命令,并执行命令。
需求背景
设计一个遥控器,用户可以通过遥控器控制电视机的开关、音量和频道。
1、定义接收者角色 Receiver,包含电视机的操作方法,如开关、音量和频道控制等。
public class TV {
public void turnOn() {
System.out.println("TV is on");
}
public void turnOff() {
System.out.println("TV is off");
}
public void changeChannel(int channel) {
System.out.println("TV channel is changed to " + channel);
}
public void adjustVolume(int volume) {
System.out.println("TV volume is adjusted to " + volume);
}
}
2、定义命令接口 Command,包含执行命令的方法 execute()。
public interface Command {
void execute();
}
3、定义具体命令类 ConcreteCommand,实现 Command 接口,包含一个接收者对象和一个执行命令的方法 execute(),在执行命令时调用接收者对象的相应方法。
public class TurnOnCommand implements Command {
private TV tv;
public TurnOnCommand(TV tv) {
this.tv = tv;
}
@Override
public void execute() {
tv.turnOn();
}
}
public class TurnOffCommand implements Command {
private TV tv;
public TurnOffCommand(TV tv) {
this.tv = tv;
}
@Override
public void execute() {
tv.turnOff();
}
}
public class ChangeChannelCommand implements Command {
private TV tv;
private int channel;
public ChangeChannelCommand(TV tv, int channel) {
this.tv = tv;
this.channel = channel;
}
@Override
public void execute() {
tv.changeChannel(channel);
}
}
public class AdjustVolumeCommand implements Command {
private TV tv;
private int volume;
public AdjustVolumeCommand(TV tv, int volume) {
this.tv = tv;
this.volume = volume;
}
@Override
public void execute() {
tv.adjustVolume(volume);
}
}
4、定义调用者角色 Invoker,包含一个命令对象和一个执行命令的方法 executeCommand(),在执行命令时调用命令对象的 execute() 方法。
public class RemoteControl {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void executeCommand() {
command.execute();
}
}
5、编写测试案例,创建一个遥控器对象和一个电视机对象,分别创建开机、关机、调节频道和音量的命令对象,并将命令对象设置到遥控器对象中,最后执行遥控器对象的执行命令方法。
public class Test {
public static void main(String[] args) {
TV tv = new TV();
RemoteControl remoteControl = new RemoteControl();
Command turnOnCommand = new TurnOnCommand(tv);
Command turnOffCommand = new TurnOffCommand(tv);
Command changeChannelCommand = new ChangeChannelCommand(tv, 3);
Command adjustVolumeCommand = new AdjustVolumeCommand(tv, 50);
remoteControl.setCommand(turnOnCommand);
remoteControl.executeCommand();
remoteControl.setCommand(changeChannelCommand);
remoteControl.executeCommand();
remoteControl.setCommand(adjustVolumeCommand);
remoteControl.executeCommand();
remoteControl.setCommand(turnOffCommand);
remoteControl.executeCommand();
}
}
6、输出结果
TV is on
TV channel is changed to 3
TV volume is adjusted to 50
TV is off
7、总结
命令模式可以将请求和处理请求的对象解耦,使得请求者和接收者之间没有直接关系,从而提高系统的灵活性和可扩展性。在本案例中,遥控器充当了调用者角色,电视机充当了接收者角色,四个具体命令类充当了命令角色,将请求和处理请求的对象解耦,使得用户可以通过遥控器来控制电视机的开关、音量和频道。