设计模式之命令行模式

命令行接口

/**
 * 命令行接口
 *
 * @author caiyuanhao456 cyhyx521@gmail.com
 * @date 2019/12/8 20:59
 */
public interface Command {
    /**
     * 执行方法
     */
    void execute();
}

具体命令对象

/**
 * 具体命令对象
 *
 * @author caiyuanhao456 cyhyx521@gmail.com
 * @date 2019/12/8 21:00
 */
public class ConcreteCommand implements Command {
    private Receiver receiver;

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

    /**
     * 执行方法
     */
    @Override
    public void execute() {
        //具体命令来调用接受者的方法,接受者才是真正的逻辑
        receiver.action();
    }
}

请求者对象

/**
 * 请求者对象 负责调用命令对象的执行请求
 *
 * @author caiyuanhao456 cyhyx521@gmail.com
 * @date 2019/12/8 21:01
 */
public class Invoker {
    private Command command;

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

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

    /**
     * 执行命令对象的方法
     */
    public void action() {
        command.execute();
    }
}

接收者

/**
 * 接受者,具体实施和执行一个请求,任何一个类都可以是接受者,也就是我们想真正实现的业务逻辑
 *
 * @author caiyuanhao456 cyhyx521@gmail.com
 * @date 2019/12/8 21:06
 */
public class Receiver {
    public void action(){
        System.out.println("需要执行的操作");
    }
}

客户端

/**
 * 在java的java.lang.Runnable中用到了命令行模式,
 * 客户端对象.
 *
 * @author caiyuanhao456 cyhyx521@gmail.com
 * @date 2019/12/8 21:11
 */
public class Client {
    public static void main(String[] args) {
        //接受者,实现具体逻辑
        Receiver receiver = new Receiver();
        //将接受者放入命令对象
        Command command = new ConcreteCommand(receiver);
        //调用命令对象
        Invoker invoker = new Invoker(command);
        invoker.action();
    }
}

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

人生中没有四季 唯有那寒冬的荒野