命令模式将请求封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也可支持撤销的操作。
命令模式可将”动作的请求者”从”动作的执行者”对象中解耦。
需求实例:遥控器控制点灯的开关。
1、创建一个命令
客户负责创建命令对象(开灯)。让所有的命令对象实现相同的包含一个方法的接口。
public interface Command {
public void execute();
}
针对具体的命令对象,需要有一个被这个命令控制的实体,让该实体成为命令的接受者,执行命令的操作。
public class LightOnCommand implements Command {
//命令的接受者,否则具体的实施
Light light;
public LightOnCommand(Light light){
this.light=light;
}
public void execute() {
//调用接受者的方法,开灯
light.on();
}
}
2、创建接受者实体,它负责接受请求,执行命令。它是动作的执行者。
public class Light {
public void on(){
System.out.println("灯亮了");
}
}
3、创建调用者,它是动作的请求者,要调用具体的命令实体,可以设置不同的命令。
public class SimpleRemoteControl {
//保存不同的命令
Command command;
public SimpleRemoteControl(){}
//设置和接受不同的命令
public void setCommand(Command command){
this.command=command;
}
//触发命令的执行
public void buttonWasPresses(){
command.execute();
}
}
4、实际使用
public class RemoteControlTest {
public static void main(String[] args) {
//定义调用者实体(请求者)
SimpleRemoteControl simpleControl=new SimpleRemoteControl();
//调用接受者实体(执行者)
Light light=new Light();
//定义命令,需要设置一个接受者
Command lightCommand=new LightOnCommand(light);
//在调用者中设置命令
simpleControl.setCommand(lightCommand);
//发送请求,开灯
simpleControl.buttonWasPresses();
}
}