1.解释器模式简介
- 英文名称
Interpreter - 主要目的
给定一种语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 - 使用场景
当有一种语言需要解释执行,并且你可以将该语言中的句子表示为一个抽象语法树时,最适合使用解释器模式。
2.解释器模式代码示例
- 测试平台
1.开发语言:C++
2.开发工具:VS2015
3.操作系统:Win7 X64 代码说明
1.AbstractExpression–抽象表达式类,定义抽象接口;
2.TerminalExpression–终结符表达式类,具体表达式类,本例中表示大写数字的结尾;
3.NonterminalExpression_Num、NonterminalExpression_Unit–非终结符表达式类,具体表达式类。在本例中分别用来表示实际大写数字和具体的单位。注意:
1.本例用解释器模式来实现报销时的大写数字的转换;
2.通过定义相应的终结符、数字表达式类及单位表达式类,可以实现小写数字到大写数字的转换。具体代码
#include <iostream>
#include <list>
using namespace std;
//抽象表达式,声明一个抽象的解释操作。这个接口为抽象语法树种所有的节点所共享
class AbstractExpression
{
public:
//函数功能:构造函数
//参数: int num[IN] -- 具体数字
//返回值: 无
AbstractExpression(int num) :m_Num(num) {}
//函数功能:解释抽象表达式的含义
//参数: 无
//返回值: 无
virtual void Interpret() = 0;
protected:
int m_Num; //数字
};
//TerminalExpression(终结符表达式),实现与文法中的终结符相关联的解释操作,本例中表示大写数字的结尾
class TerminalExpression :public AbstractExpression
{
public:
//函数功能:构造函数
//参数: int num[IN] -- 具体数字
//返回值: 无
TerminalExpression(int num):AbstractExpression(num)
{}
//函数功能:解释抽象表达式的含义
//参数: 无
//返回值: 无
void Interpret()
{
cout << "元整" << endl;
}
};
//数字类,非终结符解释器,用来表示具体的大写数字
class NonterminalExpression_Num :public AbstractExpression
{
public:
//函数功能:构造函数
//参数: int num[IN] -- 具体数字
//返回值: 无
NonterminalExpression_Num(int num):
AbstractExpression(num) {}
//函数功能:解释抽象表达式的含义
//参数: 无
//返回值: 无
void Interpret()
{
switch (this->m_Num)
{
case 0:
cout << "零";
break;
case 1:
cout << "壹";
break;
case 2:
cout << "贰";
break;
case 3:
cout << "叁";
break;
case 4:
cout << "肆";
break;
case 5:
cout << "伍";
break;
case 6:
cout << "陆";
break;
case 7:
cout << "柒";
break;
case 8:
cout << "捌";
break;
case 9:
cout << "玖";
break;
}
}
};
//单位类,非终结符解释器,用来表示具体的大写数字单位
class NonterminalExpression_Unit :public AbstractExpression
{
public:
//函数功能:构造函数
//参数: int num[IN] -- 具体数字
//返回值: 无
NonterminalExpression_Unit(int num) :
AbstractExpression(num) {}
//函数功能:解释抽象表达式的含义
//参数: 无
//返回值: 无
void Interpret()
{
switch (this->m_Num)
{
case 10:
cout << "拾";
break;
case 100:
cout << "佰";
break;
case 1000:
cout << "仟";
break;
}
}
};
int main()
{
list<AbstractExpression*> pressionList;
//将124从小写字母,转换为大写字母
AbstractExpression* pExp1 = new NonterminalExpression_Num(1);
AbstractExpression* pExp2 = new NonterminalExpression_Unit(100);
AbstractExpression* pExp3 = new NonterminalExpression_Num(2);
AbstractExpression* pExp4 = new NonterminalExpression_Num(10);
AbstractExpression* pExp5 = new NonterminalExpression_Num(4);
AbstractExpression* pExp6 = new TerminalExpression(0);
pressionList.push_back(pExp1);
pressionList.push_back(pExp2);
pressionList.push_back(pExp3);
pressionList.push_back(pExp4);
pressionList.push_back(pExp5);
pressionList.push_back(pExp6);
cout << "124的大写数字形式如下:" << endl;
for each (AbstractExpression* var in pressionList)
{
var->Interpret();
}
delete pExp1;
pExp1 = NULL;
delete pExp2;
pExp2 = NULL;
delete pExp3;
pExp3 = NULL;
delete pExp4;
pExp4 = NULL;
delete pExp5;
pExp5 = NULL;
delete pExp6;
pExp6 = NULL;
getchar();
return 0;
}
- 输出结果
栏目导航
上一篇:设计模式学习笔记(C++实现)(十五)–命令模式
下一篇:设计模式学习笔记(C++实现)(十七)–迭代器模式
参考文献:
1.《设计模式:可复用面向对象软件的基础》