• 软件设计命令模式


    多次撤销和重复的命令模式
    某系统需要提供一个命令集合(注:可以使用链表,栈等集合对象实现),用于存储一系列命令对象,并通过该命令集合实现多次undo()和redo()操作,可以使用加法运算来模拟实现。

    类图

    java

    package rjsj.no16;
    
    abstract class AbstractCommand{//抽象命令
        public abstract int execute(int value);
        public abstract int undo();
        public abstract int redo();
    }
    
    class ConcreteCommand extends AbstractCommand{//具体命令
        private Adder adder = new Adder();
        private int value;
    
        public int execute(int value) {
            this.value=value;
            return adder.add(value);
        }
    
        public int undo() {
            return adder.add(-value);
        }
    
        public int redo() {
            return adder.add(+value);
        }
    }
    
    class CalculatorForm {//调用者
        private AbstractCommand command;
    
        public void setCommand(AbstractCommand command) {
            this.command=command;
        }
    
        //业务方法,用于调用命令类的方法
        public void compute(int value) {
            int i = command.execute(value);
            System.out.println("执行运算,运算结果为:" + i);
        }
    
        public void undo() {
            int i = command.undo();
            System.out.println("执行撤销,运算结果为:" + i);
        }
    
        public void redo() {
            int i = command.redo();
            System.out.println("执行重复,运算结果为:" + i);
        }
    }
    
    class Adder {//接收者
        private int num=0;
    
        public int add(int value) {
            num+=value;
            return num;
        }
    }
    
    class Client {//客户类
        public static void main(String args[]) {
            CalculatorForm form = new CalculatorForm();
            ConcreteCommand command = new ConcreteCommand();
            form.setCommand(command);
    
            form.compute(10);
            form.redo();
            form.compute(5);
            form.compute(10);
            form.undo();
    
        }
    }

    C++

    #include<iostream>
    #include<stack>
    using namespace std;
    int num=0;
    class AbstractCommand {
    public:
        virtual int execute(int value)=0;
        virtual int undo()=0;
        virtual int redo()=0;
    };
    class Adder {
    
    public:
        int add(int value) {
            num+=value;
            return num;
        }
    };
    class AddCommand :public AbstractCommand {
    private:
        Adder *adder;
        stack<int> unStack;
        stack<int> reStack;
    public:
        int undo() {
            int i=0;
            if (unStack.empty()) {
                i=-1;
            }else{
                int pop = unStack.top();
                reStack.push(pop);
                unStack.pop();
                if(!unStack.empty()){
                    i=unStack.top();
                }
            }
    
            return i;
        }
        int redo() {
             int i=0;
             if (reStack.empty()) {
                 i=-1;
             }else{
                 int pop = reStack.top();
                 reStack.pop();
                 unStack.push(pop);
                 i=pop;
    
             }
             return i;
         }
         int execute(int value) {
    
             int v = 0;
             if (unStack.empty()) {
                 v = adder->add(value);
                 unStack.push(v);
             } else {
                 v = adder->add(value);
                 unStack.push(v);
                 if (!reStack.empty()) {
                     for (int i = 0; i < reStack.size(); i++) {
                     }
                 }
             }
             return v;
         }
    };
    class CalculatorForm {
    private:
        AbstractCommand *command;
    public:
        void setCommand(AbstractCommand *command) {
            this->command =command;
        }
        void compute(int value) {
            command->execute(value);
        }
        void undo() {
            int i = command->undo();
            if(i==-1){
                cout<<"已不存在数据"<<endl;
            }else{
                cout<<"执行成功,运算结果是:"<<i<<endl;
            }
        }
        void redo() {
            int i = command->redo();
            if(i==-1){
                cout<<"已恢复"<<endl;
            }
            else{
                cout<<"执行成功,运算结果是:"<<i<<endl;
            }
        }
    };
    int main(){
        CalculatorForm *form = new CalculatorForm();
        AddCommand *command = new AddCommand();
        form->setCommand(command);
        //计算
        cout<<"------计算过程------"<<endl;
        form->compute(1);
        form->compute(2);
        form->compute(3);
        form->compute(4);
        //多次撤回
        cout<<"------撤回过程------"<<endl;
        form->undo();
        form->undo();
        form->undo();
        form->undo();
        form->undo();
        //多次恢复
        cout<<"------恢复过程------"<<endl;
        form->redo();
        form->redo();
        form->redo();
        form->redo();
        form->redo();
        return 0;
    }

    运行截图

  • 相关阅读:
    elasticsearch + python
    Django中的监控组件Prometheus
    MySQL索引原理以及最左前缀原则
    Insert ignore,还是insert replace还是insert on duplicate key update区别
    PyTorch中Tensor与numpy数据之间时共享的条件:
    在Numpy中numpy.nan显示成-9223372036854775808的缘故
    mac上安装pil报错: ERROR: Could not find a version that satisfies the requirement pil (from versions: none):
    OSError: [Errno 48] Address already in use
    curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused
    在实际项目中使用git推代码踩过的坑
  • 原文地址:https://www.cnblogs.com/Arisf/p/15685679.html
Copyright © 2020-2023  润新知