目录
前言
当我们需要对各种请求进行参数化,模板化,但是不清楚被请求的执行者或操作者的信息时,可以使用Command命令模式。
1 定义
Command命令模式:将请求封装为对象,从而使你可以使用不同的请求对客户进行参数化,对请求进行排队或者记录请求日志,以及支持可以撤销的操作。
2 适用性
- 抽象出待执行的操作以参数化各种不同请求。
- 可以在不同时刻指定、排列和执行请求。
- 支持可撤销的操作。
- 支持修改日志。
- 用构建在原语操作的高层操作构建系统。
3 结构
3.1 结构图
命令模式结构图:
3.2 参与者
根据上图参与者说明如下:
- Client:请求的客户端。
- Command:将客户请求参数化为Command命令,并设置特定的Receiver。
- ConcreteCommand:具体的命令,设置了具体的Receiver。
- Receiver:执行特定请求的特定操作。
- ConcreteReceiver:实例化的接收者,执行最终特定的操作。
协作过程如下:
客户通过创建一个具体Concrete命令,并设置具体的接收者,以达到解耦请求和执行者。执行过程通过Command.execute调用具体的接收者的action操作。
4 Spring实际应用举例
主要是JdbcTemplate类,该类简化了用户对jdbc的操作,并避免了命令错误。
4.1 Command——JdbcTemplate
JdbcTemplate定义如下:
可以看出该类定义了多个execute方法也就是命令方法,通过设置不同的回调参数(具体的Receiver)来实现对不同请求的参数化操作。
4.2 Receiver——StatementCallback
以具体的QueryStatementCallback为例,该类实现了StatementCallback:
具体的查询操作,调用具体Receiver.action进行操作。
5 总结
当需要统一参数化请求,同时有可撤销和可记录等需求时,可以考虑使用Command模式。
参考文献
[1]. 《设计模式》