定义
命令模式将请求封装成对象,以便使用不同的请求,队列,或者日志来参
数化其他对象。命令模式也支持可撤销的操作。
模式结构
盗用一下UML图
解释一下,命令模式一般有以下几个角色
1.client 客户类,即动作的请求者
2.receiver 动作的执行者,封装好事物的具体动作action
3.command <> 负责命令的执行,execute() 处理命令的逻辑,
必须实现。(ps 一般在构造器传入具体类,毕竟命令不创造类)
4.invoker 调用者,调用客户所需的command
模式实现
以书里的遥控器为例子
遥控器就是client,遥控器想要开灯,关灯,开电视。。。等等
或许以后还要扩展类。
按一般的实现,我会创建具体对象,灯对象,电视对象等等。。
然后在按钮上调用light.on()…
这看起来似乎可行,但代码的耦合度就很高了,以后要扩展代码
怎么办,比如加入开洗衣机按钮,那不仅要创建洗衣机类,还要
在遥控器类添加类,话要写方法。
还有按钮要让电扇高低档,电视换台呢。
所以说不要为了实现而写代码,还要考虑程序的扩展性,将变化从
代码里分离开。
这样看来,变化的是对象的执行方法不一样,不变的是我们对对象的
调用方法,我们只需要 遥控器.pressButton(),其他就交给命令
command.execute(),比如我们要开灯就调用具体实现类 openLightCommand.execute().
命令模式的优缺点
1.将动作的请求者和动作的执行者分离开,降低了程序的耦合度
2.命令可以添加undo方法以支持撤销 常用于日志请求
3.但会产生很多command其他等类,管理麻烦
总结
命令模式还可支持队列请求,常用于日程安排,线程池,工作队列等。调用者调用
只需考虑什么时候调用即可