设计模式(一):命令模式(2)——命令模式扩展之宏命令

前言

命令模式的讲解分为四篇:

设计模式(一):命令模式(1)——基本的命令模式

设计模式(一):命令模式(2)——命令模式扩展之宏命令

设计模式(一):命令模式(3)——命令模式扩展之队列请求

设计模式(一):命令模式(4)——命令模式扩展之日志请求

一、升级遥控器

1.需求

经过上一节的设计,我们的遥控器每个按键都具备了基本的开关功能,还有一个按键具备了撤销功能。但人类都是懒惰的,现在我们想要按下0号插槽的On按钮时就可以将电灯、空调、洗衣机打开,按下0号插槽的Off按钮时就可以将电灯、空调、洗衣机关闭,按下undo按钮时就可以将这一系列的命令撤销掉。也就是说我们需要遥控器按钮实现宏命令。

2.实现

代码地址:https://github.com/wutianqi/desin-patterns/tree/master/design-pattern/src/main/java/com/wutqi/p1/command_pattern/p2/macro

 要让遥控器按钮实现宏命令,那么按钮所发出的宏命令中的动作的执行者就是一系列命令的集合。撤销命令也是一个宏命令,里面动作的执行者也是一个宏命令。让我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按钮实现了开和关的宏命令,撤销按钮也成功撤销了之前执行的宏命令。

二、总结

由改造的遥控器的案例中,我们看到命令模式支持宏命令来实现一组动作。这也是命令模式的优点所在。

posted @ 2019-01-30 16:14  安静的boy  阅读(846)  评论(0编辑  收藏  举报