解释器模式
其他二十三种设计模式
#include<iostream>
#include<vector>
#include<sstream>
using namespace std;
class PlayContext {
public:
void SetPlayText(string _text) {
this->text = _text;
}
string GetPlayText() {
return text;
}
private:
string text;
};
class Expression {
public:
virtual void Excute(string _key, string _value) = 0;
void Interpret(PlayContext* _context) {
if (_context->GetPlayText().length() == 0)
return;
else {
vector<string> vs;
stringstream ss(_context->GetPlayText());
string buf;
string s;
while(ss >> buf)
vs.push_back(buf);
string PlayKey = vs[0];
string PlayText = vs[1];
Excute(PlayKey, PlayText);
vs.erase(vs.begin(), vs.begin() + 2);
for (vector<string>::iterator it = vs.begin(); it != vs.end();it++) {
s += (*it);
if (it != vs.end() - 1)
s += " ";
}
_context->SetPlayText(s);
}
}
};
class Note :public Expression {
public:
virtual void Excute(string _key, string _value) {
string note = "";
switch (_key[0]) {
case'C':
note = "1"; break;
case'D':
note = "2"; break;
case'E':
note = "3"; break;
case'F':
note = "4"; break;
case'G':
note = "5"; break;
case'A':
note = "6"; break;
case'B':
note = "7"; break;
default:
break;
}
cout << note << " ";
}
};
class Scale :public Expression {
public:
virtual void Excute(string _key, string _value) {
string scale = "";
switch (_value[0])
{
case'1':
scale = "低音"; break;
case'2':
scale = "中音"; break;
case'3':
scale = "高音"; break;
default:
break;
}
cout << scale << " ";
}
};
class Speed :public Expression {
public:
virtual void Excute(string _key, string _value) {
int _valueToInt = atoi(_value.c_str());
string speed = "";
if (_valueToInt < 500)
speed = "快速";
else if (_valueToInt >= 1000)
speed = "慢速";
else
speed = "中速";
cout << speed << " ";
}
};
void test1() {
PlayContext context;
cout << "上海滩: " << endl;
context.SetPlayText("T 600 O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5");
Expression* expression = NULL;
while (context.GetPlayText().length() > 0)
{
char str = context.GetPlayText()[0];
switch (str)
{
case'O':
expression = new Scale; break;
case'T':
expression = new Speed; break;
case'C':
case'D':
case'E':
case'F':
case'G':
case'A':
case'B':
case'P':
expression = new Note; break;
default:
break;
}
expression->Interpret(&context);
delete expression;
}
}
int main() {
test1();
return 0;
}