命令模式:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
命令模式类图: 下面我们来用命令模式来实现控制灯的开关。 类图: 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 onturn light offturn light offturn light on新闻热点
疑难解答