Skip to content

命令模式

一、介绍

命令设计模式(Command Pattern)是将请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的对象,并把该命令传给相应的对象 执行命令,属于行为型模式

命令模式是一种特殊的策略模式,体现的是多个策略执行的问题,而不是选择的问题

二、应用场景

  • 只要是你认为是命令的地方,就可以采用命令模式
  • 日常每个界面、按钮、键盘 事件操作都是 命令设计模式

三、角色

  • 抽象命令(Command):需要执行的所有命令都在这里声明

  • 具体命令(ConcreteCommand):定义一个接收者和行为之间的弱耦合,实现execute()方法,负责调用接收者的相应操作,execute()方法通常叫做执行方法。

  • 接受者(Receiver):负责具体实施和执行一个请求,干活的角色,命令传递到这里是应该被执行的,实施和执行请求的方法叫做行动方法

  • 请求者(Invoker):负责调用命令对象执行请求,相关的方法叫做行动方法

  • 客户端(Client):创建一个具体命令(ConcreteCommand)对象并确定其接收者。

四、优缺点

  • 优点

    • 调用者角色与接收者角色之间没有任何依赖关系,不需要了解到底是哪个接收者执行,降低了系统耦合度
    • 扩展性强,新的命令可以很容易添加到系统中去。
  • 缺点

    • 过多的命令模式会导致某些系统有过多的具体命令类

五、代码

具体执行命令类

package com.lcy.study.design.command;

/**
 * @Description 空调遥控器
 * @Author lcy
 * @Date 2021/7/27 15:29
 */
public class ConditionReviewer {

    public void on(){
        System.out.println("打开空调");
    }

    public void off(){
        System.out.println("关闭空调");
    }

}

命令接口

package com.lcy.study.design.command;

/**
 * @Description 命令执行接口
 * @Author lcy
 * @Date 2021/7/27 15:31
 */
public interface Command {

    /**
     * 执行命令
     * @author lcy
     * @date 2021/7/27 15:32
     **/
    void execute();
}

具体命令类

package com.lcy.study.design.command;

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * @Description 打开空调命令
 * @Author lcy
 * @Date 2021/7/27 15:31
 */
@AllArgsConstructor
public class OnCommand implements Command{

    /**
     * 遥控器
     */
    private final ConditionReviewer conditionReviewer;

    @Override public void execute(){
        System.out.println("OnCommand -> execute");
        conditionReviewer.on();
    }
}
package com.lcy.study.design.command;

import lombok.AllArgsConstructor;

/**
 * @Description 打开空调命令
 * @Author lcy
 * @Date 2021/7/27 15:31
 */
@AllArgsConstructor
public class OffCommand implements Command{

    /**
     * 遥控器
     */
    private final ConditionReviewer conditionReviewer;

    @Override public void execute(){
        System.out.println("OffCommand -> execute");
        conditionReviewer.off();
    }
}

命令执行类

package com.lcy.study.design.command;

/**
 * @Description 命令执行者
 * @Author lcy
 * @Date 2021/7/27 15:38
 */
public class Invoker {

    private Command onCommand;

    private Command offCommand;

    public void setOnCommand(Command onCommand){
        this.onCommand = onCommand;
    }

    public void setOffCommand(Command offCommand){
        this.offCommand = offCommand;
    }

    /**
     * 开机
     */
    public void on(){
        onCommand.execute();
    }

    /**
     * 关机
     */
    public void off(){
        offCommand.execute();
    }

    public static void main(String[] args){

        ConditionReviewer conditionReviewer = new ConditionReviewer();
        Command  onCommand= new OnCommand(conditionReviewer);
        Command  offCommand= new OffCommand(conditionReviewer);
        Invoker invoker = new Invoker();
        invoker.setOnCommand(onCommand);
        invoker.setOffCommand(offCommand);

        invoker.on();
        invoker.off();

    }

}