大话设计模式解释器模式c++实现

解释器模式

其他二十三种设计模式

#include<iostream>
#include<vector>     
#include<sstream>    //提供stringstream

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]) {
    
         //WOW!!!  string还可以这样用
		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) {
    
    
		//cout << _value << endl;        --(string)600
		int _valueToInt = atoi(_value.c_str());     //string转为int型--关键
		//cout << _valueToInt << endl;   --(int)600
		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;
}

猜你喜欢

转载自blog.csdn.net/wode_0828/article/details/114285407