定义:
将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化。
本质上是对命令进行封装,将发出命令的责任和执行命令的责任分隔开。
角色:
- 接收者类:实现了具体的业务操作,拿电视机来说,这个类实现了电视机的开启和关闭的真实操作方法。
- 抽象命令类:定义了一个执行命令的方法接口,由其子类实现。
- 具体命令类(一个命令一个类):实现抽象命令接口,关联接收者类,调用接受者类中具体的一个命令,比如这个具体命令类是要开启电视机,那么执行命令的方法就调用接受者对象中的开启命令。
- 调用者类:相当于遥控器,把所有可能的操作集合在一起,客户端只需要使用遥控器就可以完成所有命令的发起,构造方法(形参是是抽象命令队对象,实参是具体命令对象)完成所有具体命令对象的注入,提供执行命令的方法,用具体命令对象调用具体命令的执行方法。
关键代码:
//接收者:真正执行命令的对象
public class Light {
public void open(){
System.out.println("打开电灯!");
}
}
public interface Command {
public void execute();
}
// 这是一个命令,所以需要实现Command接口
public class LightOnCommand implements Command {
Light light;
// 构造器传入某个电灯,以便让这个命令控制,然后记录在实例变量中
public LightOnCommand(Light light) {
this.light = light;
}
// 这个execute方法调用接收对象的on方法
public void execute() {
light.on();
}
}
public class SimpleRemoteControl {
// 有一个插槽持有命令,而这个命令控制着一个装置
Command slot;
public SimpleRemoteControl() {}
// 这个方法用来设置插槽控制的命令
public void setCommand(Command command) {
slot = command;
}
// 当按下按钮时,这个方法就会被调用,使得当前命令衔接插槽,并调用它的execute方法
public void buttonWasPressed() {
slot.execute();
}
}
客户端使用
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();
}
}
核心理解
命令模式主要完成的事情是把命令的具体实施和命令的发出解耦。
有一个具体干活的类(命令接收者类),这个类里有所有执行具体命令的方法。
有一个抽象的命令类,这个类定义了一个执行的方法接口,然后它的子类(这些子类的个数和具体命令的个数是一致的,比如说那个具体干活的类需要做两件事,一个是打开电脑,一个是关闭电脑,那么就会有两个不同的子类来继承这个抽象的命令类!)继承这个类并重写它的执行命令的方法,这里有个点需要注意:这些子类需要关联那个命令接收者类,用那个类的方法来重写执行方法!