0
点赞
收藏
分享

微信扫一扫

命令模式(Command)

定义:

将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化。

本质上是对命令进行封装,将发出命令的责任和执行命令的责任分隔开。

角色:

  • 接收者类:实现了具体的业务操作,拿电视机来说,这个类实现了电视机的开启和关闭的真实操作方法。
  • 抽象命令类:定义了一个执行命令的方法接口,由其子类实现。
  • 具体命令类(一个命令一个类):实现抽象命令接口,关联接收者类,调用接受者类中具体的一个命令,比如这个具体命令类是要开启电视机,那么执行命令的方法就调用接受者对象中的开启命令。
  • 调用者类:相当于遥控器,把所有可能的操作集合在一起,客户端只需要使用遥控器就可以完成所有命令的发起,构造方法(形参是是抽象命令队对象,实参是具体命令对象)完成所有具体命令对象的注入,提供执行命令的方法,用具体命令对象调用具体命令的执行方法。

关键代码:

//接收者:真正执行命令的对象
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();
}
}

核心理解

命令模式主要完成的事情是把命令的具体实施和命令的发出解耦

有一个具体干活的类(命令接收者类),这个类里有所有执行具体命令的方法

有一个抽象的命令类,这个类定义了一个执行的方法接口,然后它的子类(这些子类的个数和具体命令的个数是一致的,比如说那个具体干活的类需要做两件事,一个是打开电脑,一个是关闭电脑,那么就会有两个不同的子类来继承这个抽象的命令类!)继承这个类并重写它的执行命令的方法,这里有个点需要注意:这些子类需要关联那个命令接收者类,用那个类的方法来重写执行方法!

作者:​​靠谱杨​​​,

我可能不是天才,但我会努力成为人才。

更多日常分享尽在我的VX公众号:小杨的挨踢IT生活

命令模式(Command)_软件工程



举报

相关推荐

0 条评论