Head First设计模式学习笔记-------(6)命令模式

时间:2022-11-28 07:59:51

今天,我们又接到了一个棘手的项目。让我们来看看项目要求吧。

Head First设计模式学习笔记-------(6)命令模式

让我们看看他们发过来的光盘里的类和遥控器的模型吧

Head First设计模式学习笔记-------(6)命令模式

Head First设计模式学习笔记-------(6)命令模式

如果直接设计这样一个程序,问题就非常大了,我们需要把“动作的请求者”从“动作的执行者”对象中解耦出来,什么意思呢?

让我们看一个之前讲到过的餐厅的例子吧

Head First设计模式学习笔记-------(6)命令模式

如同这张图里面说描述,女招待员不需要知道订单上有什么,需要怎么完成,只要把订单放在柜台然后调用orderUP方法就可以了。

让我们来看一下这个图对应的命令模式的图

Head First设计模式学习笔记-------(6)命令模式

让我们先做一个简单遥控器来熟悉下这个命令模式吧

实现命令接口:

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();
}
}
看了这个简单遥控器的例子,是不是稍微有点了解这个模式了。
定义命令模式:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

命令模式类图:

Head First设计模式学习笔记-------(6)命令模式

让我们看一下我们为这个项目写的遥控器API文档吧

Head First设计模式学习笔记-------(6)命令模式

命令模式总结:

1:命令模式将发出请求的对象和执行请求的对象解耦。

2:在被解耦的两者之间是通过命令对象进行沟通的。命令对象封装了接收者和一个或一组动作。

3:调用者通过命令对象的execute方法发出请求,这会使得接收者的动作被调用。

4:调用者可以接受命令当做参数,甚至在运行时动态地进行。

5:命令也可以用来实现日志和事物系统。