#include
#include
#include
#include
#include
#include
using namespace std;
class Adder
{
private:
int num = 0;
public:
int add(int value)
{
num += value;
return num;
}
};
class AbstractCommand
{
public:
virtual int execute(int value) = 0;
virtual int undo() = 0;
virtual int redo() = 0;
};
class CalculatorForm
{
private:
AbstractCommand* command;
public:
void setCommand(AbstractCommand* command)
{
this->command = command;
}
void compute(int value)
{
int i = (*command).execute(value);
string i_str;
stringstream sStream;
sStream << i;
sStream >> i_str;
cout << "执行运算,运算结果为:" + i_str << endl;
}
void undo()
{
int i = (*command).undo();
string i_str;
stringstream sStream;
sStream << i;
sStream >> i_str;
cout << "执行撤销,运算结果为:" + i_str << endl;
}
void redo()
{
int i = (*command).redo();
string i_str;
stringstream sStream;
sStream << i;
sStream >> i_str;
cout << "执行恢复,运算结果为:" + i_str << endl;
}
};
class ConcreteCommand :public AbstractCommand
{
private:
Adder adder;
int value;
stack<int> st;
queue<int> q;
public:
int execute(int value)
{
this->value = value;
st.push(value);
return adder.add(value);
}
int undo()
{
value = st.top();
q.push(value);
st.pop();
return adder.add(-value);
}
int redo()
{
value = q.front();
q.pop();
return adder.add(value);
}
};
int main()
{
CalculatorForm form;
AbstractCommand* command;
command = new ConcreteCommand();
form.setCommand(command);
form.compute(10);
form.compute(5);
form.compute(10);
cout<<"第一次撤销:"<<endl;
form.undo();
cout << "第二次撤销:" << endl;
form.undo();
cout << "第三次撤销:" << endl;
form.undo();
cout << "第一次恢复:" << endl;
form.redo();
cout << "第二次恢复:" << endl;
form.redo();
cout << "第三次恢复:" << endl;
form.redo();
}