• 设计模式(一):命令模式(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按钮实现了开和关的宏命令,撤销按钮也成功撤销了之前执行的宏命令。

    二、总结

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

  • 相关阅读:
    【.Net】多语言查看MSDN
    【.Net】 显示星期字符串
    【.Net】 判断时间字符串正确性
    【.Net】 实现窗口拖动
    【.Net】 Winform 单例运行实例
    Kendo 计算字段
    Kendo UI 的 k-template
    UpdatePanel中用后台CS代码调用JS代码,先执行控件事件,后触发JS
    SQL常用
    Node.js 安装
  • 原文地址:https://www.cnblogs.com/wutianqi/p/10335613.html
Copyright © 2020-2023  润新知