定义:将请求封装成对象,以便用不同的请求,队列或者日志来参数化其它对象。命令模式也可以支持撤销操作。仔细看这个定义一个命令对象通过在特定的接受者上绑定一组动作来封装一个请求要达到这一点,命令对象需要将动作和接受者包进对象中。
首先来个类图
再来看一个具体的例子
public interface Command{
//实现命令接口命令对象只有一个方法
public void execute();
}
public class LightOnCommand implments Command{
//实现电灯开的命令对象
Light light;
public LightOnCommand(Light light){
this.light=light;//接受者
}
public void execute(){
light.on();//这个execute()调用接受者的实际执行
}
}
//遥控器对象也就是调用者
pubic class SimpleRemoteControl{
Command slot;//有一个插槽持有命令,命令控制一个装置
public SimpleRemoteControl(){}
pulic void setCommand(Command command){
slot=command;//这个方法用来设置插槽控制的命令可以多次调用
}
public void buttonWasPressed(){
//按下遥控按钮时,这个方法就会被调用,使得当前插槽衔接命令
//并调用它的execute
slot.execute();
}
}
//测试一把这是命令模式的客户
public class RemoteControlTest{
public static void main(String args[]){
SimpleRemoteControl remote= new SimpleRemoteControl();//这是调用者
Light light= new Light();//这是接受者
LightOmCommand lightOn = new lightOnCommand(light);//这是命令对象
remote.setCommand(lightOn );//调用者有一个命令对象
remote. buttonWasPressed();//模拟按下按钮
}
}
总结一把:命令模式将发出请求的对象和执行请求的象解耦,在被解耦的两者之间通过命令对象来沟通,命令对象封装了接受者的动作。调用者通过调用命令对象的execute方法来使接受者的动作被调用,调用者可以接受命令对象当做参数。甚至在运行时动态的进行。上面代码没有实现撤销undo方法。命令模式常用于队列请求和日志。