• 设计模式命令模式


    类图

     

    源码

    Command.java
    package com.demo;
    
    public interface Command {
        /**
         * 执行命令
         */
        void execute();
    
        void redo();
        /**
         * 撤销命令
         */
        void undo();
    }
    
    Light.java
    package com.demo;
    
    public class Light {
    
        public void on() {
            System.out.println("灯亮了...");
        }
    
        public void off() {
            System.out.println("灯暗了...");
        }
    }
    LightOffCommand.java
    package com.demo;
    
    public class LightOffCommand implements Command {
    
        private Light light;
    
        public LightOffCommand(Light light) {
            this.light = light;
        }
    
        @Override
        public void execute() {
            light.off();
        }
        
        @Override
        public void redo() {
            light.on();
        }
    
        @Override
        public void undo() {
            light.on();
        }
    }
    LightOnCommand.java
    package com.demo;
    
    public class LightOnCommand implements Command {
    
        private Light light;
    
        public LightOnCommand(Light light) {
            this.light = light;
        }
    
        @Override
        public void execute() {
            light.on();
        }
        
        @Override
        public void redo() {
            light.off();
        }
    
        @Override
        public void undo() {
            light.off();
        }
    }
    NoCommand.java
    package com.demo;
    
    public class NoCommand implements Command {
    
        @Override
        public void execute() {
            // TODO 自动生成的方法存根
    
        }
        
        @Override
        public void redo() {
            // TODO 自动生成的方法存根
    
        }
    
    
        @Override
        public void undo() {
            // TODO 自动生成的方法存根
    
        }
    
    }
    RemoteInvoker.java
    package com.demo;
    
    public class RemoteInvoker {
    
        /**
         * 开关命令数组,模拟有很多对开关数组
         */
        private Command[] onCommands;
        private Command[] offCommands;
        /**
         * 撤销(回退)命令
         */
        private Command undoCommand;
        private Command redoCommand;
    
        public RemoteInvoker(int length) {
            // 有几组开关,就设置多少数组
            onCommands = new Command[length];
            offCommands = new Command[length];
            // 把每个命令初始化成空命令,避免空指针异常
            Command noCommand = new NoCommand();
            undoCommand = noCommand;
            redoCommand = noCommand;
            for (int i = 0; i < length; i++) {
                onCommands[i] = noCommand;
                offCommands[i] = noCommand;
            }
        }
    
    
        public void setCommond(int slot, Command onCommand, Command offCommand) {
            onCommands[slot] = onCommand;
            offCommands[slot] = offCommand;
        }
    
    
        public void onButton(int slot) {
            onCommands[slot].execute();
            //为撤销(回退)按钮记录动作
            undoCommand = onCommands[slot];
            redoCommand = onCommands[slot];
        }
    
        public void offButton(int slot) {
            offCommands[slot].execute();
            //为撤销(回退)按钮记录动作
            undoCommand = offCommands[slot];
            redoCommand = onCommands[slot];
        }
    
        public void undoButton() {
            undoCommand.undo();
        }
    
    
        public void redoButton() {
            // TODO 自动生成的方法存根
            redoCommand.redo();
        }
    }
    
    Client.java
    package com.demo;
    
    public class Client {
    
        public static void main(String[] args) {
            // 1、创建接收者
            Light light = new Light();
            // 2、创建命令对象
            LightOnCommand lightOnCommand = new LightOnCommand(light);
            LightOffCommand lightOffCommand = new LightOffCommand(light);
            // 3、创建一组开关并用命令对象装载它
            RemoteInvoker invoker = new RemoteInvoker(1);
            invoker.setCommond(0, lightOnCommand, lightOffCommand);
            // 4、测试
            invoker.onButton(0);
            invoker.offButton(0);
            System.out.println("撤销命令");
            invoker.undoButton();
            System.out.println("重做命令");
            invoker.redoButton();
          }
    }

    测试截图

     

  • 相关阅读:
    codevs 1115 开心的金明
    POJ 1125 Stockbroker Grapevine
    POJ 2421 constructing roads
    codevs 1390 回文平方数 USACO
    codevs 1131 统计单词数 2011年NOIP全国联赛普及组
    codevs 1313 质因数分解
    洛谷 绕钉子的长绳子
    洛谷 P1276 校门外的树(增强版)
    codevs 2627 村村通
    codevs 1191 数轴染色
  • 原文地址:https://www.cnblogs.com/lx06/p/15688528.html
Copyright © 2020-2023  润新知