有这样一种场景:客户创建了一个命令对象(来杯cafe),命令对象存储在调用者(服务员)中。稍后客户要求调用者(服务员)执行命令。该命令就会被执行(端来一杯cafe)或者丢弃(不搭理客户)。能够适应这样一种情景的,大致就是命令模式。
让我们实现另一个简单的命令模式的例子:
定义一个命令接口:让所有的命令对象实现相同的包含一个方法的接口。命令的内容就概化为execute()
public interface Command{
public void execute();
}
实现一个打开电灯的命令:
//点灯控制命令(是否点亮)
public class LightCommand implements Command{
Light light;//命令接受者(我们控制的电灯)
public LightOnCommand(Light light){
this.light=light;
}
@Override
public void execute(){//方法中调用接收对象
light.on();
}
}
假设我们有这样一个遥控器可以执行上面的电灯控制命令:
public class SimpleRemoteControl{
Command slot;//存放命令
public void setCommand(Command command){//设置控制命令
slot=command;
}
public void buttonPressed(){//按下开关
slot.execute();
}
}
我们对上面的命令模式做个最终测试:
public class RemoteControlTest{
public static void main(String[] args){
SimpleRemoteControl remote=new SimpleRemoteControl();
Light light=new Light();//电灯,灯泡,看做名词对象
LightOnCommand lightOn=new LightCommand(light);//实例化一个命令,并将接受者传给它
remote.setCommand(lightOn);//把命令传个调用者
remote.buttonPressed();
}
}
命令模式的定义:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。