将命令和实际执行者分离,对外提供统一表现
命令模式
概述
将命令封装成对象中,具有以下作用:
- 使用命令来参数化其它对象
- 将命令放入队列中进行排队
- 将命令的操作记录到日志中
- 支持可撤销的操作
类图
- Command:命令
- Receiver:命令接收者,也就是命令真正的执行者
- Invoker:通过它来调用命令
- Client:可以设置命令与命令的接收者
场景模拟:
顾客点菜,小二记下菜,点完之后小二通知各种菜系的厨师做菜
这里的小二就是 Invoker,顾客就是 Client,菜系就是 Command,厨师就是 Receiver
具体实现
不使用命令模式实现
后续如果添加菜品,用 if 不好维护
使用命令模式
维护一个菜系( ICuisine )接口,还有一个厨师( ICook )接口,菜系中调用厨师做饭;
ICuisine
GuangDoneCuisine
JiangSuCuisine
厨师
广东厨师
江苏厨师
小二,向厨师下达命令
测试
输出:
调用时序图
可以看到,顾客 new 了俩菜,也就是 new 了俩命令对象(ConcreteCommand),将对象以参数形式传入小二,小二(Invoker)接收到,调用 Command,然后实际的厨师(receiver)开始做菜了。