zoukankan      html  css  js  c++  java
  • 设计模式命令模式

    类图

     

    源码

    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();
          }
    }

    测试截图

     

  • 相关阅读:
    函数模板、函数模板特化、重载函数模板、非模板函数重载
    输出流格式化(以操纵子方式格式化,以ios类成员函数方式格式化)
    文件的读写、二进制文件的读写、文件随机读写
    文件流(fstream, ifstream, ofstream)的打开关闭、流状态
    流类库继承体系(IO流,文件流,串流)和 字符串流的基本操作
    对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr<class>、实现Ptr_vector
    operator new 和 operator delete 实现一个简单内存泄漏跟踪器
    异常与继承、异常与指针、异常规格说明
    程序错误、异常(语法、抛出、捕获、传播)、栈展开
    C语言错误处理方法、C++异常处理方法(throw, try, catch)简介
  • 原文地址:https://www.cnblogs.com/lx06/p/15688528.html
Copyright © 2011-2022 走看看