命令模式(command pattern) 详细解释
命令模式: 将请求封装成对象, 以便使用不同的请求\队列\日志来參数化其它对象. 命令模式也支持可撤销操作.
命令模式:
调用者(Invoker);
命令(Command): 可运行方法(execute), 详细命令(Concrete Command);
接受者(Receiver): 调用命令(Set Command);
详细方法:
1. 详细对象.
/**
* @time 2014年6月9日
*/
package command;
/**
* @author C.L.Wang
*
*/
public class Light {
public Light() {}
public void on() {
System.out.println("Light is on");
}
public void off() {
System.out.println("Light is off");
}
}
/**
* @time 2014年6月9日
*/
package command;
/**
* @author C.L.Wang
*
*/
public class GarageDoor {
public GarageDoor() {}
public void up() {
System.out.println("Garage Door is Open");
}
public void down() {
System.out.println("Garage Door is Closed");
}
public void stop() {
System.out.println("Garage Door is Stopped");
}
public void lightOn() {
System.out.println("Garage light is on");
}
public void lightOff() {
System.out.println("Garage light is off");
}
}
2. 命令接口(command interface), 包括运行方法execute().
/**
* @time 2014年6月9日
*/
package command;
/**
* @author C.L.Wang
*
*/
public interface Command {
public void execute();
}
3. 详细命令(concrete command), 继承命令接口, 实现接口的方法.
/**
* @time 2014年6月9日
*/
package command;
/**
* @author C.L.Wang
*
*/
public class LightOnCommand implements Command {
Light light;
public LightOnCommand (Light light) {
this.light = light;
}
/* (non-Javadoc)
* @see command.Command#execute()
*/
@Override
public void execute() {
// TODO Auto-generated method stub
light.on();
}
}
/**
* @time 2014年6月9日
*/
package command;
/**
* @author C.L.Wang
*
*/
public class GarageDoorOpenCommand implements Command {
GarageDoor garageDoor;
public GarageDoorOpenCommand (GarageDoor garageDoor) {
this.garageDoor = garageDoor;
}
/* (non-Javadoc)
* @see command.Command#execute()
*/
@Override
public void execute() {
// TODO Auto-generated method stub
garageDoor.up();
}
}
4. 接受者(receiver), 通过传递的命令參数, 调用运行方法.
/**
* @time 2014年6月9日
*/
package command;
/**
* @author C.L.Wang
*
*/
public class SimpleRemoteControl {
Command slot;
public SimpleRemoteControl() {}
public void setCommand(Command command) {
this.slot = command;
}
public void buttonWasPressed() {
slot.execute();
}
}
5. 測试, 创建接收者, 创建对象, 将对象传递至命令, 接受者调用命令, 运行.
/**
* @time 2014年6月9日
*/
package command;
/**
* @author C.L.Wang
*
*/
public class RemoteControlTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SimpleRemoteControl remote = new SimpleRemoteControl();
Light light = new Light();
GarageDoor garageDoor = new GarageDoor();
LightOnCommand lightOn = new LightOnCommand(light);
GarageDoorOpenCommand garageOpen =
new GarageDoorOpenCommand(garageDoor);
remote.setCommand(lightOn);
remote.buttonWasPressed();
remote.setCommand(garageOpen);
remote.buttonWasPressed();
}
}