首页 > 其他分享 >软件设计-命令模式 _

软件设计-命令模式 _

时间:2022-11-04 15:55:42浏览次数:241  
标签:undo form 软件设计 value 命令 int command 模式 public

多次撤销和重复的命令模式
某系统需要提供一个命令集合(注:可以使用链表,栈等集合对象实现),用于存储一系列命令对象,并通过该命令集合实现多次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;
}
 

 

运行截图

标签:undo,form,软件设计,value,命令,int,command,模式,public
From: https://www.cnblogs.com/wlqyyds/p/16858102.html

相关文章

  • 软件设计-迭代器模式
    JAVA和C++常见数据结构迭代器的使用信1305班共44名同学,每名同学都有姓名,学号和年龄等属性,分别使用JAVA内置迭代器和C++中标准模板库(STL)实现对同学信息的遍历,要求按照学号从......
  • 行为型设计模式之访问者模式
    访问者模式访问者模式属于行为型模式。它是一种将数据结构与数据操作分离的设计模式。是指封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定......
  • 广州华锐互动:虚拟现实技术打造安全事故模拟体验新模式
    随着我国的不断发展和文明程度的不断提高,安全问题越来越受到重视。对于安全事故的预防处理,作业人员每年都需要进行至少一次的安全教育培训和考核,但是很多事故无法亲身经历,......
  • 观察者模式
    观察者模式对象间存在一对多关系时,使用观察者模式.当一个对象被修改时,会自动通知依赖它的对象,观察者模式属于行为模式如何解决抽象类里有一个ArrayList存放观察者们......
  • 图扑软件智慧云展厅,开启数字化展馆新模式
    前言随着疫情的影响以及新兴技术的不断发展,展会的发展形式也逐渐从线下转向线上。通过“云”上启动、云端互动、双线共频的形式开展。通过应用大数据、人工智能、沉浸式交......
  • 线程安全的单例模式
    懒汉式加方法锁publicclassSingleton{privatestaticSingletonsingleton=null;privateSingleton(){}publicstaticsynchronizedSingletongetIn......
  • Linux必学技能 | 17个案例带运维小白快速精通Awk命令,拿来即用
    1、https://www.toutiao.com/article/7161683050835903006/?app=news_article&timestamp=1667537391&use_new_style=1&req_id=20221104124951010158149027023AE6E2&group_......
  • LINUX开发常用命令
     配置网卡命令:vi/etc/systemd/network/50-static.network查看代码[Match]Name=eth0[Network]Address=192.168.5.9/24Gateway=192.168.5.1......
  • SpringCloud(六) - RabbitMQ安装,三种消息发送模式,消息发送确认,消息消费确认(自动,手动)
    1、安装erlang语言环境1.1创建erlang安装目录mkdirerlang1.2上传解压压缩包上传到:/root/解压缩#tar-zxvfotp_src_22.0.tar.gz1.3进入解压缩目录,指定......
  • 制作带curl命令的容器
    创建一个容器,启动后使用curl命令请求指定的地址方法一、固定的地址,创建Dockerfile前先修改entrypoint.sh里的地址准备entrypoint.shcurl-shttp://www.baidu.com创建Do......