今天,我们又接到了一个棘手的项目。让我们来看看项目要求吧。
让我们看看他们发过来的光盘里的类和遥控器的模型吧
如果直接设计这样一个程序,问题就非常大了,我们需要把“动作的请求者”从“动作的执行者”对象中解耦出来,什么意思呢?
让我们看一个之前讲到过的餐厅的例子吧
如同这张图里面说描述,女招待员不需要知道订单上有什么,需要怎么完成,只要把订单放在柜台然后调用orderUP方法就可以了。
让我们来看一下这个图对应的命令模式的图
让我们先做一个简单遥控器来熟悉下这个命令模式吧
实现命令接口:
public interface Command {实现一个打开电灯的命令:
public void execute(); //这个接口只有一个方法
}
public class LightOnCommand implements Command { //命令需要实现Command接口使用命令对象:
Light light;
public LightOnCommand (Light light) { //构造器被传入了某个电灯,以便让这个命令控制,然后记录在实例变量中。一旦调用了execute方法,就由这个电灯对象成为接收者,负责接受请求。
this.light = light;
}
public void execute() { //这个execute方法调用接收对象的on方法
light.on();
}
}
public class SimpleRemoteControl {看了这个简单遥控器的例子,是不是稍微有点了解这个模式了。
Command slot; //有一个插槽持有命令,而这个命令控制着一个装置
public SimpleRemoteControl () {}
public void setCommand(Command command) { //这个方法用来设置插槽控制的命令
slot = command;
}
public void buttonWasPressed() { //当按下按钮时,这个方法就会被调用,使得当前命令衔接插槽,并调用它的execute方法
slot.execute();
}
}
定义命令模式:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
命令模式类图:
让我们看一下我们为这个项目写的遥控器API文档吧
命令模式总结:
1:命令模式将发出请求的对象和执行请求的对象解耦。
2:在被解耦的两者之间是通过命令对象进行沟通的。命令对象封装了接收者和一个或一组动作。
3:调用者通过命令对象的execute方法发出请求,这会使得接收者的动作被调用。
4:调用者可以接受命令当做参数,甚至在运行时动态地进行。
5:命令也可以用来实现日志和事物系统。