命令模式
在一些需求场景中,有发出命令的对象,有执行命令的对象,有具体的命令。但是如果要将这些模型抽象出来可以复用,这就是常见的命令模式。
命令模式中的5个角色
(1)调用者:负责调用命令对象,执行命令对象的方法
(2)执行者:具体执行某一方法
(3)抽象命令:一个接口或抽象类,让具体命令实现
(4)具体命令:实现抽象命令的具体方法
(5)客户端:创建具体的命令对象和其接受者,并执行请求
应用场景
比如我现在在键盘上打字输入文本,我的角色就是客户端,键盘就是调用者,而电脑就是执行者,我在键盘上输入新增,撤销,恢复命令。就会在电脑上同步显示出来。整个过程就是命令模式。
比如领导命令下属打印一份放假文件,领导就是调用者,下属就是执行者,打印一份文件就是抽象命令,打印具体的放假命令就是具体的命令。在这个命令模式中,领导不关心具体是哪个下属去打印,下属也不知道给哪位领导在打印,他能打印很多文件,当前这一刻他只打印一份放假的文件。这样耦合度更低。
代码示例
(1)调用者Invoker
public class Invoker {
private Command command;
// 构造注入
public Invoker(Command command){
this.command = command;
}
// 设值注入
public void setCommand(Command command){
this.command = command;
}
// 业务方法,用于调用命令类
public void call(){
command.execute();
}
}
(2)执行者Receiver
public class Receiver {
public void action(String action) {
System.out.println(action);
}
}
(3)抽象命令Command
public abstract class Command {
public abstract void execute();
}
(4)具体命令
新增ConcreteCommandAdd
public class ConcreteCommandAdd extends Command{
// 与请求接收者相关联
private Receiver receiver;
public ConcreteCommandAdd(Receiver receiver){
this.receiver = receiver;
}
@Override
public void execute() {
receiver.action("add action");
}
}
恢复ConcreteCommandRedo
public class ConcreteCommandRedo extends Command{
// 与请求接收者相关联
private Receiver receiver;
public ConcreteCommandRedo(Receiver receiver){
this.receiver = receiver;
}
@Override
public void execute() {
receiver.action("redo action");
}
}
撤销ConcreteCommandUndo
public class ConcreteCommandUndo extends Command{
// 与请求接收者相关联
private Receiver receiver;
public ConcreteCommandUndo(Receiver receiver){
this.receiver = receiver;
}
@Override
public void execute() {
receiver.action("undo action");
}
}
(5)客户端Test
public class Test {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command ccAdd = new ConcreteCommandAdd(receiver);
Command ccRedo = new ConcreteCommandRedo(receiver);
Command ccUndo = new ConcreteCommandUndo(receiver);
Invoker invokerccAdd = new Invoker(ccAdd);
Invoker invokerccRedo = new Invoker(ccRedo);
Invoker invokerccUndo = new Invoker(ccUndo);
invokerccAdd.call();
invokerccRedo.call();
invokerccUndo.call();
}
}
执行结果:
add action
redo action
undo action