刚看到这个模式的名称,你的第一反应是什么?
你会不会这样想:什么,居然有命令模式?
它是指我们常用的CMD场景吗?
命令模式(command pattern),请求以一种命令的形式包裹在对象中,并传给调用对象,调用对象寻找可以处理命令的合适对象,由该对象执行命令;它是一种数据驱动的行为型模式。
业务场景:CMD的实现;认为是命令的地方都可以使用命令模式,还有需要对行为进行记录、撤销、重做、事务等处理的场景。 关键代码:命令调用者、命令、命令接收执行者,这三个主要的角色。
下面看UML类图:
代码实现步骤:
1、命令接口;
/**
* 1. 命令接口
* @author 程就人生
* @Date
*/
public interface ICommand {
public void execute();
}
2.具体命令实现者;
/**
* 2.1 版本查询
* @author 程就人生
* @Date
*/
public class VersionCommand implements ICommand {
private Receiver receiver;
public VersionCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
receiver.version();
}
}
/**
* 2.2 帮助查询
* @author 程就人生
* @Date
*/
public class HelpCommand implements ICommand{
private Receiver receiver;
public HelpCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
receiver.help();
}
}
3.命令接收者、执行者;
/**
* 4.命令接收者---执行者
* @author 程就人生
* @Date
*/
public class Receiver {
public void help(){
System.out.println("version");
System.out.println("help");
System.out.println("show databases");
}
public void version(){
System.out.println("1.0.0 version");
}
}
4.命令调用者;
import java.util.HashMap;
import java.util.Map;
/**
* 3. 调用者
* @author 程就人生
* @Date
*/
public class Invoker {
private static Map<String, ICommand> commandMap = new HashMap<>();
public void addCommand(String commandName, ICommand command) {
commandMap.put(commandName, command);
}
public void carriageReturn(String commandName){
commandMap.get(commandName).execute();
}
}
5.测试代码;
public static void main(String[] argo){
// 命令接收者---执行者
Receiver receiver = new Receiver();
// 命令调用者
Invoker invoker = new Invoker();
invoker.addCommand("help", new HelpCommand(receiver));
invoker.addCommand("version", new VersionCommand(receiver));
// 输入help命令,并执行help命令
invoker.carriageReturn("help");
}
运行结果:
version
help
show databases
这段代码的意思是:使用命令模式,模仿cmd实现了一个获取帮助命令和版本信息命令的简易功能。
最后总结
命令调用者Invoker 聚合了多个具体命令实现类,每个具体命令实现类又依赖命令接收执行者Receiver ,命令调用者只需输入命名名称按下回车便可执行命令。
新加入一个命令,只需再扩展一个具体命令实现类,并在命令接收、执行者Receiver 中加入新的命令,命令调用者再聚合一下新扩展的具体命令实现类,就可以调用新命令了。
命令模式主要的职责是对命令请求者和命令接收者进行解耦,特别是在需要对行为进记录、回滚或重做的业务场景。