什么是命令模式
将请求封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
命令模式特点
1.命令模式将发出请求的对象和执行请求的对象解耦
2.被解耦的两者之间是通过命令对象进行沟通的。命令对象封装了接受者的一个或一组动作
3.调用者通过调用命令对象的execute()发出请求,这会使得接受者的动作被调用
4.调用者可以接受命令当做参数,甚至在运行时动态地进行。
5.命令可以支持撤销,做法是实现一个undo()方法来回到execute()被执行前的状态
6.宏命令是一种简单的延伸,允许调用多个命令,宏方法也可以支持撤销
7.实际操作时,很常见使用“聪明”命令对象,也就是直接实现了请求,而不是将工作直接委托给接收者
8.命令也可以用来实现日志和事物系统
一个使用了命令模式设计的程序
首先我们有一个命令接口,所有的命令都必须实现该接口
灯光类
控制灯光开
控制灯光关
音响类
控制音响开
控制音响关
接下来还有一个风扇类,风扇有高中低三挡之分
风扇高档命令
风扇中档命令
风扇低档命令
吊扇关命令
无命令
party命令组
远程控制类(遥控器)
再来一个测试类测试一下
输出结果如下
—– Remote Control —–
[slot 0] com.headfirst.command.light.LightOnCommand com.headfirst.command.light.LightOffCommand
[slot 1] com.headfirst.command.light.LightOnCommand com.headfirst.command.light.LightOffCommand
[slot 2] com.headfirst.command.fan.CeilingFanLowCommand com.headfirst.command.fan.CeilingFanOffCommand
[slot 3] com.headfirst.command.stereo.StereoOnWithCDCommand com.headfirst.command.stereo.StereoOffWithCDCommand
[slot 4] com.headfirst.command.NoCommand com.headfirst.command.NoCommand
[slot 5] com.headfirst.command.NoCommand com.headfirst.command.NoCommand
[slot 6] com.headfirst.command.NoCommand com.headfirst.command.NoCommand
Living Room灯亮了
Living Room灯灭了
Kitchen灯亮了
Kitchen灯灭了
Living Room吊扇以低速运行
Living Room吊扇关闭
打开音响
放入一张CD
声音设置为[11]分贝
关闭音响
这里是分割线————
Living Room灯亮了
Living Room灯灭了
Living Room灯亮了
Living Room灯灭了
Living Room灯亮了
Living Room灯灭了
这里是分割线————
—– Remote Control —–
[slot 0] com.headfirst.command.light.LightOnCommand com.headfirst.command.light.LightOffCommand
[slot 1] com.headfirst.command.light.LightOnCommand com.headfirst.command.light.LightOffCommand
[slot 2] com.headfirst.command.fan.CeilingFanLowCommand com.headfirst.command.fan.CeilingFanOffCommand
[slot 3] com.headfirst.command.stereo.StereoOnWithCDCommand com.headfirst.command.stereo.StereoOffWithCDCommand
[slot 4] com.headfirst.command.fan.CeilingFanHighCommand com.headfirst.command.fan.CeilingFanOffCommand
[slot 5] com.headfirst.command.fan.CeilingFanMediumCommand com.headfirst.command.fan.CeilingFanOffCommand
[slot 6] com.headfirst.command.NoCommand com.headfirst.command.NoCommand
Living Room吊扇以高速运行
Living Room吊扇关闭
Living Room吊扇以高速运行
Living Room吊扇以中速运行
Living Room吊扇以高速运行
这里是分割线——-准备执行party模式—–
Living Room灯亮了
打开音响
放入一张CD
声音设置为[11]分贝
Living Room吊扇以高速运行
Living Room灯灭了
关闭音响
Living Room吊扇关闭
Living Room灯亮了
打开音响
放入一张CD
声音设置为[11]分贝
Living Room吊扇以高速运行
总结
当需要把请求对象和和执行请求对象解耦的时候,我们就使用命令模式。