behavior:命令模式 (Command Pattern)
2019-03-02 本文已影响0人
柳源居士
把方法调用(method invocation)封装起来。通过封装方法调用,可以用来记录日志、或者重复使用这些封装来实现撤销操作。
定义:
将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。
命令模式的更多用途:队列请求
把命令打包成一组,然后一个一个执行
命令模式的更多用途:日志请求
将操作记录下来,如果系统有异常,从异常点开始进行日志操作。
对于更高级的应用,命令模式可以扩展到事务处理中,就是指一群操作必须全部完成,要么不进行任何操作。
实现:
package command;
public interface Command {
public void execute();
public void undo();
}
package command;
public class Light {
void lightOn(){
System.out.println("light on");
}
void lightOff(){
System.out.println("light off");
}
}
package command;
public class LightOffCommand implements Command{
Light light;
public LightOffCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.lightOff();
}
@Override
public void undo() {
light.lightOn();
}
}
package command;
public class LightOnCommand implements Command{
Light light;
public LightOnCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.lightOn();
}
@Override
public void undo() {
light.lightOff();
}
}
package command;
public class NoCommand implements Command{
@Override
public void execute() {
}
@Override
public void undo() {
}
}
package command;
public class SimpleRemoteControl {
Command on;
Command off;
public SimpleRemoteControl() {
this.on=new NoCommand();
this.off=new NoCommand();
}
void setOnSlot(Command command){
this.on=command;
}
public void onButtonWasPressed(){
on.execute();
}
void setOffSlot(Command command){
this.off=command;
}
public void offButtonWasPressed(){
off.execute();
}
}
package command;
public class TestCommand {
public static void test(){
Light light=new Light();
LightOnCommand lightOnCommand=new LightOnCommand(light);
LightOffCommand lightOffCommand=new LightOffCommand(light);
SimpleRemoteControl simpleRemoteControl=new SimpleRemoteControl();
simpleRemoteControl.setOnSlot(lightOnCommand);
simpleRemoteControl.onButtonWasPressed();
simpleRemoteControl.setOffSlot(lightOffCommand);
simpleRemoteControl.offButtonWasPressed();
}
}