首页 > 代码库 > 命令模式

命令模式

package com.tc.order;

 

 

/**命令模式  就是发出命令的对象与执行命令的对象解耦。两者通过中介者传递,命令封装了接收者以及

 * 要执行的n个动作中介者不需要知道传递的对象信息。命令可以撤销,如下面的undo()

 * 命令接口

 */

public interface Command {

/**

* 执行命令

*/

public void execute();

/**

* 回滚操作

*/

public void undo();

}

 

package com.tc.order;

 //要操作的对象

public class Light {

public void on() {

System.out.println("the light is on.");

}

 

public void off() {

System.out.println("the light is off.");

}

}

 

package com.tc.order;

 //关灯操作命令

public class LightOffCommand implements Command {

private Light light;

 

public LightOffCommand(Light light) {

this.light = light;

}

 

@Override

public void execute() {

light.off();

}

 

@Override

public void undo() {

light.on();

}

}

 

package com.tc.order;

 //开灯操作命令

public class LightOnCommand implements Command {

private Light light;

 

public LightOnCommand(Light light) {

this.light = light;

}

 

@Override

public void execute() {

light.on();

}

 

@Override

public void undo() {

light.off();

}

}

 

package com.tc.order;

 

import java.util.ArrayList;

import java.util.List;

 

/**

 * 遥控器类

 */

public class RemoteControl {

private List<Command> onCommands;

private List<Command> offCommands;

private Command undoCommand;

 

public RemoteControl() {

onCommands = new ArrayList<Command>();

offCommands = new ArrayList<Command>();

}

 

public void setCommand(int index, Command onCommand, Command offCommand) {

int size = onCommands.size();

if (size == index) {

onCommands.add(null);

offCommands.add(null);

} else if (size < index) {

throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); 

}

onCommands.set(index, onCommand);

offCommands.set(index, offCommand);

}

 

public void onButtonWasPushed(int index) {

Command command = onCommands.get(index);

command.execute();

undoCommand = command;

}

 

public void offButtonWasPushed(int index) {

Command command = offCommands.get(index);

command.execute();

undoCommand = command;

}

 

public void undoButtonWasPushed() {

if (null == undoCommand) {

throw new IllegalArgumentException("can not undo."); 

}

undoCommand.undo();

}

}

 

package com.tc.order;

 //测试类

public class Test1 {

public static void main(String[] args) {

Light light = new Light();

 

LightOnCommand lightOnCommand = new LightOnCommand(light);

LightOffCommand lightOffCommand = new LightOffCommand(light);

 

RemoteControl remoteControl = new RemoteControl();

remoteControl.setCommand(0, lightOnCommand, lightOffCommand);

remoteControl.offButtonWasPushed(0);

 

remoteControl.undoButtonWasPushed();

}

}

命令模式