命令模式 + 责任链模式

  • Invoker 执行字符串形式的命令
    exec(String commandStr):通过CommandEnum枚举映射关系,反射实例化CommandName子类,再调用execute执行该命令
  • CommandEnum 定义了字符串形式的Command 和对应类名的映射,方便反射实例化用
  • CommandVO 解析命令字符串,转换成对应的ComamndName类,选项列表和操作数列表。
  • Command 抽象类
    • abstract execute(ComandVO) 执行一条命令
    • buildChain(List) 建立责任链
  • LSCommand 实现了Command抽象类,定义了execute方法:
    主要是调用父类buildChain(AbstractLS.class)生成所有ls命令族子类的责任链,然后开始运行责任链模式。
  • CommandName 抽象类,担任责任链的handler角色
    • CommandName nextHandler 下一个handler
    • handleMessage 判断是自己处理还是传递给下一个handler
      业务功能方法:
    • abstract getOperateParam: 定义了自己能够处理的参数
    • abstract echo: 执行业务逻辑
  • AbstractLS extends CommandName ls命令族的抽象
  • LS、LS_L、LS_A 子类,实现了getOperateParam 和 echo 方法·
invoker = new Invoker();
invoker.exec("ls -a");

总结

流程

  1. invoker接受到commandStr
  2. 通过CommandVO,将命令字符串解析根据约定的规则分解成命令部分、选项部分和操作数部分
  3. 通过CommandEnum处理解析后的命令部分,反射实例化成Command的第一层子类,LSCommand类(抽象表示一个命令族)
  4. 调用命令组抽象类LSCommand.execute方法
  5. 调用了命令组父类Command的建立责任链,这里子类AbstractLS知道自己对应的CommandName的命令组父类是AbstractLS,这样AbstractLS下的所有子类都建立成一条责任链。
  6. 建立完责任链后就开始遍历责任链,找到对应的handler子类处理命令。

扩展

如果要增加一条枚举类,增加CommandEnum的一个枚举定义,增加一个Command子类,增加一个CommandName一级子类和多个二级子类(相当于新增一条责任链)。
做到了对修改关闭,对扩展开放。

概括

由invoker通过枚举映射找到对应的命令,执行命令,而命令能找到自己的责任链,执行该责任链。

你可能感兴趣的:(命令模式 + 责任链模式)