命令模式
标签:设计模式

命令模式(Command)

命令模式是行为模式之一,Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数

1. 命令模式中的角色及其职责

1.1 Command

是一个抽象类,类中对需要执行的命令进行声明,一般来说要对外公布一个execute方法用来执行命令。

Command

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/08/06
 */
public abstract class Command {
    public abstract void execute();
}

1.2 Concrete Command

Command类的实现类,对抽象类中声明的方法进行实现

Concrete Command

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/08/06
 */
public class ConcreteCommand extends Command{
    private Receiver receiver;

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

    @Override
    public void execute() {
        this.receiver.doSomething();
    }
}

1.3 Invoker

调用者,负责调用命令。

Invoker

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/08/06
 */
public class Invoker {
    private Command command;

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

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

1.4 Receiver

接收者,负责接收命令并且执行命令。

Receiver

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/08/06
 */
public class Receiver {
    public void doSomething(){
        System.out.println("Receiver doSomething");
    }
}

Main

package com.liuyao;

public class Main {

    public static void main(String[] args) {
        Receiver receiver=new Receiver();
        Command command=new ConcreteCommand(receiver);
//        客户端可以直接执行具体的命令
        command.execute();

//        客户端通过调用者类执行命令
        Invoker invoker=new Invoker();
        invoker.setCommand(command);
        invoker.action();
    }
}

//Receiver doSomething
//Receiver doSomething

2. 应用场景

一般情况下一个对象调用另外一个对象的调用过程为:一般是创建目标对象实例,设置调用参数,调用目标对象的方法。

但在有些情况下有必要使用一个专门的类对这种调用的过程加以封装,我们把这种专门的类叫做Command类。

整个调用过程比较复杂,或者存在多处这种调用。这时,使用Command类对该调用加以封装,便于功能的再利用。

调用前后需要对调用参数进行某些处理

调用前后需要进行某些额外的处理,比如日志,缓存,记录历史操作等。

  • 2 min read

CONTRIBUTORS


  • 2 min read