命令模式(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();
    }
}

核心理解

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

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

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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM