首页 > 其他分享 >命令模式

命令模式

时间:2023-11-30 09:11:58浏览次数:37  
标签:form int 模式 unStack 命令 undo reStack redo

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

1. 提交类图;

2. 提交源代码;

#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()
    {
        // adder= new Adder();
        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()
    {
        // adder= new Adder();
        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++)
                {
                    // reStack.top();
                    // reStack.pop();
                }
            }
        }
        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;
}

标签:form,int,模式,unStack,命令,undo,reStack,redo
From: https://www.cnblogs.com/yzx-sir/p/17866475.html

相关文章

  • 适配器模式
    1模式动机在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。如何应对这种“迁移的变化”?如何既能利用现有对象(老接口)的良好实现,同时又能满足新的应用环境所要求的接口?Adapter模式主要应用于“......
  • 黑客玩具入门——2、Kali常用命令与简单工具
    一、Linux常用命令首先,我们启动kali系统,然后点击这里的命令行工具。就可以使用下面学习的命令了,另外,如果你有过计算机基础,那么Mac的terminal和Git的gitbash,都是可以练习大部分的linux命令的。下面我们就学习一些入门的基础命令sudo,系统管理者的身份执行指令,也就是说,经由sudo......
  • 实验6:原型模式
    2.提交源代码(用C++完成);3.注意编程规范。#include<iostream> classVector{private:    int*data;//指向向量数据的指针    intsize;//向量的长度 public:    //构造函数    Vector(intsize){        this->size=size;   ......
  • 实验7:单例模式
     本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解单例模式的动机,掌握该模式的结构;2、能够利用单列模式解决实际问题。 [实验任务一]:学号的单一仿照课堂的身份证的例子,实现每个同学仅有一个学号这一问题。实验要求:1. 画出对应的类图;2.提交源代码;3.注......
  • 实验8:适配器模式
    本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解适配器模式的动机,掌握该模式的结构;2、能够利用适配器模式解决实际问题。 [实验任务一]:双向适配器实现一个双向适配器,使得猫可以学狗叫,狗可以学猫抓老鼠。实验要求:1. 画出对应的类图;2.提交源代码;3.注意编......
  • 实验9:桥接模式
    本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解桥接模式的动机,掌握该模式的结构;2、能够利用桥接模式解决实际问题。 [实验任务一]:两个维度的桥接模式用桥接模式实现在路上开车这个问题,其中,车可以是car或bus,路可以是水泥路或沥青路。#include<iostream>......
  • 实验10:组合模式
    本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解组合模式的动机,掌握该模式的结构;2、能够利用组合模式解决实际问题。 [实验任务一]:组合模式用透明组合模式实现教材中的“文件夹浏览”这个例子。1.文件的执行不需真正实现,只需简单提示即可;2.提交源代码;3.......
  • FPGA 实现SPI 主机双工通信 CS前后肩可调 操作时钟频率可调 ,SPI模式可调,传输位宽可
    1//testbench2`timescale1ns/1ns3modulelcd_spi_m_tb();4regrst_n_i;5regspi_clkx_i;6reg[31:0]spi_data_i;7regspi_start;8regspi_miso_r1,spi_miso_r2;9wirespi_miso_i;10wire[0:0]spi_done;11wir......
  • linux常用命令
    linux常用命令1.文件目录介绍目录说明/bin是Binary的缩写,这个目录存放着经常使用的命令/sbins就是SuperUser的意思,这里存放的是系统管理员使用的系统管理程序/home存放着普通用户的主目录,在Linux中每个用户都有一个自己的目录,一般该目录是以用户的账户号命名的/root该目录为系统管......
  • Linux中kill %n命令是干啥的?
    在Linux或Unix下,如果你看见别人使用kill%1或者kill%n(n为一个具体的数字)命令,你知道kill%n这种带%号的用法是干嘛吗?其实kill%n表示kill掉后台程序(也可以说是作业),其中n表示Job的编号(number),而不是进程的进程号,下面我们来简单演示一下$ more initkerry.ora在没有完全......