note.h
/************************************************************************
* description: 音符类
* remark:
************************************************************************/
#ifndef _NOTE_H_
#define _NOTE_H_
#include "expression.h"
class note : public expression
{
public:
virtual void excute(string& strKey, const int nValue)
{
char szKey[2];
strncpy(szKey, strKey.c_str(), strKey.length());
string strNote;
switch (szKey[0])
{
case 'C':
strNote = "1";
break;
case 'D':
strNote = "2";
break;
case 'E':
strNote = "3";
break;
case 'F':
strNote = "4";
break;
case 'G':
strNote = "5";
break;
case 'A':
strNote = "6";
break;
case 'B':
strNote = "7";
break;
default:
strNote = "error";
break;
}
cout << strNote << " ";
}
};
#endif// _NOTE_H_
scale.h
/************************************************************************
* description: 音阶类
* remark:
************************************************************************/
#ifndef _SCALE_H_
#define _SCALE_H_
#include "expression.h"
class scale : public expression
{
public:
virtual void excute(string& strKey, const int nValue)
{
string strScale;
switch (nValue)
{
case 1:
strScale = "低音";
break;
case 2:
strScale = "中音";
break;
case 3:
strScale = "高音";
break;
default:
strScale = "error";
break;
}
cout << strScale << " ";
}
private:
};
#endif// _SCALE_H_
speed.h
#ifndef _SPEED_H_
#define _SPEED_H_
#include "expression.h"
class speed : public expression
{
public:
virtual void excute(string& strKey, const int nValue)
{
string strSpeed;
if (nValue < 3)
{
strSpeed = "快速";
}
else if (nValue >= 6)
{
strSpeed = "慢速";
}
else
{
strSpeed = "中速";
}
cout << strSpeed << " ";
}
};
#endif// _SPEED_H_
客户端: InterpreterApp.cpp
// InterpreterApp.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "note.h"
#include "scale.h"
#include "speed.h"
#include "playContext.h"
int _tmain(int argc, _TCHAR* argv[])
{
playContext context;
cout << "Music:";
context.setPlayText("T 2 O 2 E 3 G 5 G 5 ");
expression* expressObj = NULL;
while (!context.getPlayText().empty())
{
string strSep = context.getPlayText().substr(0, 1);
char szKey[2];
strncpy(szKey, strSep.c_str(), strSep.length());
switch (szKey[0])
{
case 'O':
expressObj = new scale();
break;
case 'T':
expressObj = new speed();
break;
case 'C':
case 'D':
case 'E':
case 'F':
case 'G':
case 'A':
case 'B':
case 'P':
expressObj = new note();
break;
default:
break;
}
if (NULL != expressObj)
{
expressObj->interpret(context);
}
}
system("pause");
return 0;
}










