- 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");
总结
流程
- invoker接受到commandStr
- 通过CommandVO,将命令字符串解析根据约定的规则分解成命令部分、选项部分和操作数部分
- 通过CommandEnum处理解析后的命令部分,反射实例化成Command的第一层子类,LSCommand类(抽象表示一个命令族)
- 调用命令组抽象类LSCommand.execute方法
- 调用了命令组父类Command的建立责任链,这里子类AbstractLS知道自己对应的CommandName的命令组父类是AbstractLS,这样AbstractLS下的所有子类都建立成一条责任链。
- 建立完责任链后就开始遍历责任链,找到对应的handler子类处理命令。
扩展
如果要增加一条枚举类,增加CommandEnum的一个枚举定义,增加一个Command子类,增加一个CommandName一级子类和多个二级子类(相当于新增一条责任链)。
做到了对修改关闭,对扩展开放。
概括
由invoker通过枚举映射找到对应的命令,执行命令,而命令能找到自己的责任链,执行该责任链。