命令模式:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
命令模式类图:
下面我们来用命令模式来实现控制灯的开关。
类图:
RemoteLoader来下发开/关灯的命令,RemoteControl来设置要调用的接口是LightOnCommand/LightOffCommand,最后由Light对象来实现具体的命令。
Light类代码实现:
public class Light {
public void on(){
System.out.println("turn light on");
}
public void off(){
System.out.println("turn light off");
}
}
Command接口代码实现:
public interface Command {
public void execute();
public void undo();
}
LightOnCommand类代码实现:
public class LightOnCommand implements Command{
Light light;
public LightOnCommand(Light light){
this.light = light;
}
@Override
public void execute() {
// TODO Auto-generated method stub
light.on();
}
@Override
public void undo() {
// TODO Auto-generated method stub
light.off();
}
}
LightOffCommand类代码实现:
public class LightOffCommand implements Command{
Light light;
public LightOffCommand(Light light){
this.light = light;
}
@Override
public void execute() {
// TODO Auto-generated method stub
light.off();
}
@Override
public void undo() {
// TODO Auto-generated method stub
light.on();
}
}
RemoteControl类代码实现:
public class RemoteControl {
Command command;
public void setCommand(Command command){
this.command = command;
}
public void buttonWasPushed(){
command.execute();
}
public void undoButtonWasPushed(){
command.undo();
}
}
RemoteLoader类代码实现:
public class RemoteLoader {
public static void main(String[] args){
Light light = new Light();
Command lightOnCommand = new LightOnCommand(light);
Command lightOffCommand = new LightOffCommand(light);
RemoteControl remoteControl = new RemoteControl();
remoteControl.setCommand(lightOnCommand);
remoteControl.buttonWasPushed();
remoteControl.undoButtonWasPushed();
remoteControl.setCommand(lightOffCommand);
remoteControl.buttonWasPushed();
remoteControl.undoButtonWasPushed();
}
}
运行结果:
turn light on
turn light off
turn light off
turn light on