对象行为型

定义

* 命令模式又称为行动(Action)模式或交易(Transaction)模式
* 命令模式把一个请求或者操作封装到一个对象中
* 命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能

优点

1.降低对象之间的耦合度。
2.新的命令可以很容易地加入到系统中。
3.可以比较容易地设计一个组合命令。
4.调用同一方法实现不同的功能

缺点

使用命令模式可能会导致某些系统有过多的具体命令类
因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用

入门案例:

UML图解:

代码:

Command:

//抽象命令
abstract public class Command {

    protected Receiver receiver; //命令执行者
    private String command; //命令

    public Command(Receiver receiver, String command) {
        this.receiver = receiver;
        this.command = command;
    }


    /**
     * 抽象方法
     */
    abstract public void execute();

    public String getCommand() {
        return command;
    }

    public void setCommand(String command) {
        this.command = command;
    }
}

LsfCommand:

//具体命令(请求)
public class LsfCommand extends Command {

    public LsfCommand(Receiver receiver) {
        super(receiver, "螺蛳粉");
    }

    @Override
    public void execute() {
        receiver.action( getCommand() );
    }
}

NrcCommand:

//具体命令(请求)
public class NrcCommand extends Command {

    public NrcCommand(Receiver receiver) {
        super(receiver, "牛肉串");
    }

    @Override
    public void execute() {
        receiver.action( getCommand() );
    }
}

Receiver:

//请求处理者
public class Receiver {
    public void action(String command){
        System.out.println("好的,现在就给你做" + command);
    }
}

Invoke:

//命令执行者
public class Invoker {
    private Command command;

    public Invoker(Command command){
        this.command = command;
    }

    public void execiteCommand(){
        this.command.execute();
    }

    public Command getCommand() {
        return command;
    }

    public void setCommand(Command command) {
        this.command = command;
    }
}

Client(测试):

public class Main {
    public static void main(String[] args){


        Receiver receiver = new Receiver();             //请求处理者
        Command command = new LsfCommand( receiver );   //螺蛳粉命令(具体请求)
        Invoker invoker = new Invoker( command );       //执行命令者
        invoker.execiteCommand();                       //落实执行具体的命令

        Command command2 = new NrcCommand( receiver );  //牛肉串粉命令(具体请求)
        invoker.setCommand( command2 );
        invoker.execiteCommand();

        /**
         * output:
             好的,现在就给你做螺蛳粉
             好的,现在就给你做牛肉串
         */

    }
}

以上内容均源自网络再加以修改

原文地址:https://www.cnblogs.com/tandi19960505/p/8289984.html