解释器模式

介绍:

  解释器模式(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、比较容易实现文法,因为定义抽象语法树中各个节点的类的实现大体类似,这些类都易于编写。

 

缺点:解释器模式为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。

posted @ 2020-08-24 00:15  吉尔加斯  阅读(143)  评论(0编辑  收藏  举报