命令模式(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类对该调用加以封装,便于功能的再利用。
调用前后需要对调用参数进行某些处理
调用前后需要进行某些额外的处理,比如日志,缓存,记录历史操作等。