解释器模式
介绍:
解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。比如正则表达式。
定义:
给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。
结构图:
代码(音乐解释器实现):
// 演奏内容类(Context)
//演奏内容
class PlayContext
{
public:
string strtext;
}
//表达式类(AbstractExpression)
class Expression
{
public:
//解释器
void Interpret(const PlayContext &cContext)
{
if(cContext.strtext.length != 0)
{
。。。;//共同解释部分
string strplaykey = cContext.strtext.Substring(0,1);
Excute(strplaykey);
}
}
//执行
void Excute(const string &strplaykey)=0;//抽象执行方法,需要不同的文法类实现
}
//音符类(TerminalExpression)
非终结符表达式
class TerminalExpression :Expression
{
public:
//音符的执行方法
void Excute(const string &strplaykey)
{
。。。;
}
}
//客户端
PlayContext cPlayContext;//演奏乐谱
Expression* pExpression = NULL;//解释器
cPlayContext.strtext = "12345";
pExpression = new TerminalExpression();//具体解释器
TerminalExpression.Interpret(cPlayContext);//开始演奏
使用时机:
如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
当有一个语言需要解释执行,并且你可以将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。
优点:
1、可以很容易的改变和扩展文法,因为使用类来表示文法规则,你可以使用继承来改变和扩展该文法。
2、比较容易实现文法,因为定义抽象语法树中各个节点的类的实现大体类似,这些类都易于编写。
缺点:解释器模式为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。