blog/archive/design pattern/interpreter.cpp
2024-03-19 02:45:09 +08:00

104 lines
1.9 KiB
C++

#include <iostream>
using namespace std;
//expression=command';'*
//command=action object 'from' databse 'to' database
//action='copy'|'move'
//object='view'|'table' name
//database=string
class AbstractExpression
{
public:
virtual string interpert() = 0;
};
class Object : public AbstractExpression
{
string str;
public:
Object(string str)
{
this->str=str;
}
string interpert()
{
if (str.substr(0, 4) == "view")
{
return "视图";
}
else
{
return "" + str.substr(6);
}
}
};
class Database : public AbstractExpression
{
string db;
public:
Database(string db)
{
this->db = db;
}
string interpert()
{
return db;
}
};
class Action : public AbstractExpression
{
string action;
public:
Action(string action)
{
this->action = action;
}
string interpert()
{
if (action == "copy")
{
return "复制";
}
else
{
return "移动";
}
}
};
class Command : public AbstractExpression
{
AbstractExpression *action;
AbstractExpression *object;
AbstractExpression *db1;
AbstractExpression *db2;
public:
Command(AbstractExpression *action,
AbstractExpression *object,
AbstractExpression *db1,
AbstractExpression *db2)
{
this->action = action;
this->object = object;
this->db1 = db1;
this->db2 = db2;
}
string interpert()
{
return "" + db1->interpert() + "" + action->interpert() + object->interpert() + "" + db2->interpert();
}
};
int main()
{
string cmd = "copy view from db1 to db2;move table a from db1 to db2;";
AbstractExpression *exp = new Command(new Action("copy"), new Object("view"), new Database("db1"), new Database("db2"));
cout << exp->interpert() << endl;
return 0;
}