设计模式(一):命令模式(2)——命令模式扩展之宏命令
前言
命令模式的讲解分为四篇:
一、升级遥控器
1.需求
经过上一节的设计,我们的遥控器每个按键都具备了基本的开关功能,还有一个按键具备了撤销功能。但人类都是懒惰的,现在我们想要按下0号插槽的On按钮时就可以将电灯、空调、洗衣机打开,按下0号插槽的Off按钮时就可以将电灯、空调、洗衣机关闭,按下undo按钮时就可以将这一系列的命令撤销掉。也就是说我们需要遥控器按钮实现宏命令。
2.实现
要让遥控器按钮实现宏命令,那么按钮所发出的宏命令中的动作的执行者就是一系列命令的集合。撤销命令也是一个宏命令,里面动作的执行者也是一个宏命令。让我i们来看下代码实现。
**************MacroCommand******************
/** * 宏命令 * @author wuqi * @Date 2019/1/29 17:44 */ public class MacroCommand implements Command { private List<Command> commands; public MacroCommand(List<Command> commands){ this.commands = commands; } @Override public void execute() { for(Command command : commands){ command.execute(); } } @Override public void undo() { for(int i=commands.size() - 1;i>=0;i--){ commands.get(i).undo(); } } }
**************RemoteControlTest******************
/** * 宏命令测试 * @author wuqi * @Date 2019/1/29 17:49 */ public class RemoteControlTest { public static void main(String[] args) { //创建电器 Light livingRoomLight = new Light(); AirCondition airCondition = new AirCondition(); Refrigerator refrigerator = new Refrigerator(); //创建宏命令并将其设置到遥控器中 LightOnCommand lightOnCommand = new LightOnCommand(livingRoomLight); LightOffCommand lightOffCommand = new LightOffCommand(livingRoomLight); AirConditionOnCommand airConditionOnCommand = new AirConditionOnCommand(airCondition); AirConditionOffCommand airConditionOffCommand = new AirConditionOffCommand(airCondition); RefrigeratorOnCommand refrigeratorOnCommand = new RefrigeratorOnCommand(refrigerator); RefrigeratorOffCommand refrigeratorOffCommand = new RefrigeratorOffCommand(refrigerator); List<Command> onCommands = new ArrayList<>(); onCommands.add(lightOnCommand); onCommands.add(airConditionOnCommand); onCommands.add(refrigeratorOnCommand); List<Command> offCommands = new ArrayList<>(); offCommands.add(lightOffCommand); offCommands.add(airConditionOffCommand); offCommands.add(refrigeratorOffCommand); MacroCommand onMacroCommand = new MacroCommand(onCommands); MacroCommand offMacroCommad = new MacroCommand(offCommands); RemoteControl remoteControl = new RemoteControl(); remoteControl.setCommand(0,onMacroCommand,offMacroCommad); //打开电灯,打开空调,打开冰箱 remoteControl.onButtonPushed(0); //关上电灯,关上空调,关掉冰箱 remoteControl.offButtonPushed(0); //撤销 remoteControl.undo(); } }
运行结果如下:
从运行结果我们看到遥控器的0号插槽的on和off按钮实现了开和关的宏命令,撤销按钮也成功撤销了之前执行的宏命令。
二、总结
由改造的遥控器的案例中,我们看到命令模式支持宏命令来实现一组动作。这也是命令模式的优点所在。