(行为型模式)命令模式

96 阅读2分钟

简介

命令模式是一种行为型模式。将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化。

角色

  • Command 一个具体命令的抽象接口。

  • ConcreteCommand 就是其具体的一个实现,你可以有多个Command接口的实现。具体命令本身并不实现具体的业务命令, 而是会将调用委派给一个业务逻辑对象去执行。

  • Receiver 作为具体命令的最终接收者。几乎任何对象都可以作为接收者,命令的细节由Receiver来实现。

  • Invoker 携带命令执行action请求。它不负责创建命令对象,它通常会通过构造函数从客户端处获得预先生成的命令。

使用

用电脑关机,关机,重启指令。

Command命令接口

public interface ICommand {
    
    void execute();
}

具体命令接收者Receiver

public class Receiver {

    public void shutdown(){
        System.out.println("执行关机操作");
        System.out.print("开始关机....");
    }

    public void restart(){
        System.out.println("执行重启操作");
        System.out.print("开始关机....");
        System.out.print("开始开机....");
    }

    public void start(){
        System.out.println("执行开机操作");
        System.out.print("开始开机....");
    }
}

实现命令子类ConcreteCommand

关机命令

public class ShutdownCommand implements ICommand{
    
    private Receiver receiver;
    
    public ShutdownCommand(Receiver receiver){
        this.receiver = receiver;
    }


    @Override
    public void execute() {
        System.out.println("执行关机命令");
        receiver.shutdown();
    }
}

开机命令

public class StartCommand implements ICommand{

    private Receiver receiver;

    public StartCommand(Receiver receiver){
        this.receiver = receiver;
    }


    @Override
    public void execute() {
        System.out.println("执行开机命令");
        receiver.shutdown();
    }
}

重启命令

public class RestartCommand implements ICommand{

    private Receiver receiver;

    public RestartCommand(Receiver receiver){
        this.receiver = receiver;
    }


    @Override
    public void execute() {
        System.out.println("执行重启命令");
        receiver.shutdown();
    }
}

Invoker

public class Invoker {
    
    private ICommand command;
    
    public Invoker(ICommand command){
        this.command = command;
    }
    
    public void action(){
        System.out.println("调用命令");
        command.execute();
    }
}

测试

public class Demo {

    public static void main(String[] args) {
        //构建接收者
        Receiver receiver = new Receiver();
        //创建命令指令
        ICommand startCommand = new StartCommand(receiver);
        ICommand shutdownCommand = new ShutdownCommand(receiver);
        ICommand restartCommand = new RestartCommand(receiver);
        //创建命令对象构造请求者
        Invoker invoker = new Invoker(startCommand);
        invoker.action();
        Invoker invoker1 = new Invoker(shutdownCommand);
        invoker1.action();
        Invoker invoker2 = new Invoker(restartCommand);
        invoker2.action();
    }
}

优缺点

优点

  • 将请求调用者与请求接收者进行解耦
  • 拓展性高

缺点

  • 扩展命令会导致类的数量增加 , 增加了系统实现的复杂程度