命令模式——将请求封装成对象,这可以让你使用不同的请求、队列,或者日志请求来参数化其他对象。命令模式也可以支持撤销操作。
类图
关键代码
使用遥控器打开电灯的例子。
1.命令接口
public interface Command{
public void execute();
}
2.打开电灯的命令
public class LightOnCommand implements Command{
Light light;
public LightOnCommand(Light light){
this.light = light;
}
public void execute(){
light.on();
}
}
3。遥控器
public class SimpleRemoteControl{
Command slot;
public SimpleRemoteControl(){}
public void setCommand(Command command){
slot = command;
}
public void buttonWasPressed(){
slot.execute();
}
}
4.测试类
public class RemoteControlTest{
public static void main(String[] args){
SimpleRemoteControl remote = new SimpleRemoteControl();
Light light = new Light();
LightOnCommand lightOn = new LightOnCommand(light);
remote.setCommand(lightOn);
remote.buttonWasPressed();
}
}
遥控器类就是调用者,电灯类是接收者,打开电灯命令类封装了遥控器对电灯打开的命令。
在命令模式中还可以加入撤销命令,比如在打开电灯的命令中加入undo()方法,调用light.off()方法,打开电灯命令的撤销操作就写好了。
总结
1、命令模式将发出请求的对象和执行请求的对象解耦。
在一个使用遥控器打开客厅电灯的例子中,利用命令对象,把请求(例如打开电灯)封装成一个特定对象(例如客厅电灯对象)。所以,如果每个按钮都存储一个命令对象,那么当按钮被按下的时候,就可以请命令对象做相关的工作。遥控器并不需要知道工作内容是什么,只要有个命令对象额能和正确的对象沟通,把事情做好就可以了。所以,遥控器和电灯对象解耦了。
2、在被解耦的两者之间是通过命令对象进行沟通的。命令对象封装了接收者和一个或一组动作。
3、调用者通过调用命令对象的execute()发出请求,这会使得接收者得动作被调用。
4、调用者可以接受命令当作参数,甚至在运行时动态地进行。
如有错误欢迎评论指正
本文例子来自《Head First 设计模式》一书,若需要资源可以查看评论区