命令模式:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也可支持可撤销的操作。
有一个这样的业务逻辑,在客厅的进门处有一个开关面板,该面板上有两个开关,第一个开关是打开客厅的灯,第二个开关是打开客厅的电视。下面就来具体实现一下。
首先实现电视与灯:
1 | public class Light { |
1 | public class Television { |
硬编码的方式实现开关面板功能
1 | //开关控制器 |
从上面可以看到,实现得十分的不友好,如果开关面板上再加个开关按钮就必须得再加一组判断。而且,开关控制面板跟具体的电器开关逻辑强耦合。
使用命令模式重新实现该逻辑
1 | //可以理解为这里为转接口的定义 |
1 | //开灯命令 |
1 | //关灯命令 |
1 | //打开电视 |
1 | //关闭电视 |
使用命令模式实现的开关控制器
1 | //开关控制器 |
测试代码
1 | public class Test { |
从上面的代码中可以看到,对于开关控制面板来讲,它只需要按下开关并执行命令的execute
方法,不需要知道每个电器的具体实现。
通过使用命令模式对代码的改造,让开关控制器跟具体电器的开/关彻底的解耦。如果想要在控制器上增加新的按钮,可以很方便的增加上去。使得代码更加清晰,易于扩展与维护。
从命令模式的特性中可以看出,如果此时的需求变为按下一个开关需要同时打开灯与电视,那么只需要一个command数组
即可。把LightOnCommand
和TelevisionOnCommand
放入其中,遍历调用execute
。
另外,在队列请求中大量的用到了命令模式。一个个的请求依次而来,接收端不需要知道每个请求的具体逻辑,只需要依次调用请求的execute
方法即可完成请求的处理。
上一篇:设计模式系列之五工厂模式
下一篇:设计模式系列之七适配器模式