命令模式 + 责任链模式

  • Invoker 执行字符串形式的命令
    exec(String commandStr):通过CommandEnum枚举映射关系,反射实例化CommandName子类,再调用execute执行该命令
  • CommandEnum 定义了字符串形式的Command 和对应类名的映射,方便反射实例化用
  • CommandVO 解析命令字符串,转换成对应的ComamndName类,选项列表和操作数列表。
  • Command 抽象类
    • abstract execute(ComandVO) 执行一条命令
    • buildChain(List<? extends CommandName>) 建立责任链
  • 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通过枚举映射找到对应的命令,执行命令,而命令能找到自己的责任链,执行该责任链。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容