加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

设计模式之解释器模式

发布时间:2020-12-16 01:15:27 所属栏目:百科 来源:网络整理
导读:解释器模式 Interpreter Intro 解释器模式,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 这和解释型编程语言的解释器有点类似,要根据一段输入转换成一段输出,将不易读的文本转换为易读的文本,将

解释器模式 Interpreter

Intro

解释器模式,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

这和解释型编程语言的解释器有点类似,要根据一段输入转换成一段输出,将不易读的文本转换为易读的文本,将机器不能识别的输入转成二进制机器可读的输出

当有一个语言需要解释执行,并且你可以将该语言中的句子表示为一个抽象语法树时,可以使用解释器模式。

Prototype

  • Context: 解释器上下文
  • AbstractExpression: 解释表达式抽象,定义解释操作
  • ConcreteExpression: 解释表达式实现类,实现具体的解释逻辑

Sample

public class Context
{
    public string Input { get; set; }
    public string Output { get; set; }
}

public abstract class AbstractExpression
{
    public abstract void Interpret(Context context);
}
public class TerminalExpression : AbstractExpression
{
    public override void Interpret(Context context)
    {
        Console.WriteLine("TerminalExpressionInterpreter");
    }
}
public class NoneTerminalExpression : AbstractExpression
{
    public override void Interpret(Context context)
    {
        Console.WriteLine("NonTerminalExpressionInterpreter");
    }
}


var context = new Context();
ICollection<AbstractExpression> expressions = new List<AbstractExpression>();

expressions.Add(new TerminalExpression());
expressions.Add(new TerminalExpression());
expressions.Add(new NoneTerminalExpression());

foreach (var expression in expressions)
{
    expression.Interpret(context);
}

More

解释器模式为某个语言定义它的语法(或者叫文法)表示,并定义一个解释器用来处理这个语法。

要想了解“语言”要表达的信息,我们就必须定义相应的语法规则。这样,书写者就可以根据语法规则来书写“句子”(专业点的叫法应该是“表达式”),阅读者根据语法规则来阅读“句子”,这样才能做到信息的正确传递。而我们要讲的解释器模式,其实就是用来实现根据语法规则解读“句子”的解释器。

解释器模式的代码实现比较灵活,没有固定的模板。

应用设计模式主要是应对代码的复杂性,解释器模式也不例外。它的代码实现的核心思想,就是将语法解析的工作拆分到各个小类中,以此来避免大而全的解析类。

一般的做法是,将语法规则拆分一些小的独立的单元,然后对每个单元进行解析,最终合并为对整个语法规则的解析。

解释器模式可能小众,只在一些特定的领域或情境下会被用到,比如编译器、规则引擎、正则表达式等。

Reference

  • https://github.com/WeihanLi/DesignPatterns/tree/master/BehaviorPattern/InterpreterPattern

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读