深入解析C++设计模式编程中解释器模式的运用

2020-01-06 14:50:30刘景俊

 

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; 
}