命令模式:将请求封装成对象,以便使用不同的请求、队列、或者日志来参数化其他对象。命令模式也支持可撤销的操作。也就是说一个命令接收者可以绑定一系列请求,然后通过调用接受者的执行方法来执行就可以了。将一系命令通过一个命令的执行者来执行。
这里模仿一个用遥控器对点灯开关的命令模式。
package com.modedesign.command;
/**
* @author ctt:
* @version 创建时间:2016年5月13日
* 类说明
*/
public class SimpleRemoteControlWithUndo {
Command[] onCommands;//这里可以根据情况来定义,执行方法时可根据情况去遍历执行命令
Command[] offCommands;
Command undoCommand;
public SimpleRemoteControlWithUndo() {
onCommands = new Command[5];
offCommands = new Command[5];
NoCommand noCommand = new NoCommand();
for (int i = 0; i < 5; i++) {
onCommands[i] = noCommand;
offCommands[i] = noCommand;
}
undoCommand = noCommand;
}
public void setCommand(int slot,Command onCommand,Command offCommand){
onCommands[slot] = onCommand;
offCommands[slot] = offCommand;
}
public void onButtonWasPressed(int slot){
onCommands[slot].excute();
undoCommand = offCommands[slot];
}
public void offButtonWasPressed(int slot){
offCommands[slot].excute();
undoCommand = offCommands[slot];
}
public void undoButtonWasPressed(){
undoCommand.undo();
}
}
package com.modedesign.command;
/**
* @author ctt:
* @version 创建时间:2016年5月13日
* 类说明 首先让所有的命令对象实现相同的包含一个方法的接口。即excute()
* 和一个撤销的方法undo()
*/
public interface Command {
public void excute();
public void undo();
}
package com.modedesign.command;
/**
* @author ctt:
* @version 创建时间:2016年5月13日
* 类说明
*/
public class CommandTest {
public static void main(String[] args) {
Light light = new Light();
SimpleRemoteControlWithUndo controlWithUndo
= new SimpleRemoteControlWithUndo();
controlWithUndo.setCommand(0, new LightOnCommand(light),new LightOffCommand(light));
controlWithUndo.offButtonWasPressed(0);
controlWithUndo.undoButtonWasPressed();
}
}
package com.modedesign.command;
/**
* @author ctt:
* @version 创建时间:2016年5月13日
* 类说明 light类有两个方法,on和off
*/
public class Light {
private boolean light;
public void on(){
light = true;
System.out.println("the light is on");
}
public void off(){
light = false;
System.out.println("the light is off");
}
}
package com.modedesign.command;
/**
* @author ctt:
* @version 创建时间:2016年5月13日
* 类说明
*/
public class LightOffCommand implements Command{
private Light light;
public LightOffCommand(Light light) {
super();
this.light = light;
}
@Override
public void excute() {
light.off();;
}
@Override
public void undo() {
light.on();
}
}
package com.modedesign.command;
/**
* @author ctt:
* @version 创建时间:2016年5月13日
* 类说明实现打开电灯的命令。
*/
public class LightOnCommand implements Command{
Light light;
public LightOnCommand(Light light) {
super();
this.light = light;
}
@Override
public void excute() {
light.on();
}
@Override
public void undo() {
light.off();
}
}
package com.modedesign.command;
/**
* @author ctt:
* @version 创建时间:2016年5月13日
* 类说明
*/
public class NoCommand implements Command{
@Override
public void excute() {
// TODO Auto-generated method stub
}
@Override
public void undo() {
// TODO Auto-generated method stub
}
}