美文网首页
命令模式,CMD?

命令模式,CMD?

作者: 程就人生 | 来源:发表于2022-05-01 15:22 被阅读0次

    刚看到这个模式的名称,你的第一反应是什么?

    你会不会这样想:什么,居然有命令模式?

    它是指我们常用的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 中加入新的命令,命令调用者再聚合一下新扩展的具体命令实现类,就可以调用新命令了。

    命令模式主要的职责是对命令请求者和命令接收者进行解耦,特别是在需要对行为进记录、回滚或重做的业务场景。

    相关文章

      网友评论

          本文标题:命令模式,CMD?

          本文链接:https://www.haomeiwen.com/subject/gfxyyrtx.html