解释器模式(interpreter)

简介: 解释器模式(interpreter)

一、什么是解释器模式?

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

如果在一个系统中需要匹配字符的需求在软件的很多地方都会使用,而且行为之间都非常类似,过去的做法是针对特定的需求,编写特定的函数,比如判断Email、匹配电话号码等等,与其为每一个特定需求都写一个算法函数,不如使用一种通用的搜索算法来解释执行一个正则表达式,该正则表达式定义了待匹配字符串的集合。而所谓的解释器模式,正则表达式就是他的一种应用,解释器为正则表达式定义了一个文法,如果表示一个特定的正则表达式,以及如何解释这个正则表达式。


e87026fe4f2be466a3cc3b9649492c63.png


Context:包含解释器之外的一些全局信息。


AbstractExpression:抽象表达式,声明一个抽象的解释操作,这个接口为抽象语法中所有的节点所共享。


TerminalExpression:终结符表达式,实现与文法中的终结符相关联的解释操作。


NonterminalExpression:非终结符表达式,为文法中的非终结符实现解释操作。对文法中每一条规则R1、R2……Rn都需要一个具体的非终结符表达式类。


二、有什么优点吗?

满足依赖倒转原则,对文法的扩展和维护带来方便


三、有什么缺点?

文法中的每一条规则至少定义了一个类,包含许多文法可能难以管理和维护;


四、什么时候应用呢?

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


五、代码展示

场景:让小菜用QB或者手机说明书中定义的规则去编写音乐程序,让一段文法去让QB或手机去翻译成具体的指令来执行。


①、解释器模式


af28081534eb8b4a31f9ca26790ca362.png


AbstractExpression(抽象表达式),声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享

abstract class AbstractExpression
{
    public abstract void Interpret(Context context);
}

TerminalExpression(终结符表达式),实现与文法中的终结符相关联的解释操作。实现抽象表达式中所要求的接口,主要是一个interpret()方法。文法中每一个终结符都有一个具体终结符表达式与之相对应。

class TerminalExpression : AbstractExpression
{
    public override void Interpret(Context context)
    {
        Console.WriteLine("终端解释器");
    }
}

NonterminalExpression(非终结符表达式),为文法中的非终结符实现解释操作。

class NonterminalExpression:AbstractExpression
{
    public override void Interpret(Context context)
    {
        Console.WriteLine("非终端解释器");
    }
}

Context,包含解释器之外的一些全局信息。

class Context
{
        private string input;
        public string Input
        {
            get { return input; }
            set { input = value; }
        }
        private string output;
        public string Output
        {
            get { return output; }
            set { output = value; }
        }
}

客户端

Context context = new Context();     
IList<AbstractExpression> list = new List<AbstractExpression>();
list.Add(new TerminalExpression());
list.Add(new NonterminalExpression());
list.Add(new TerminalExpression());
list.Add(new TerminalExpression());
foreach (AbstractExpression  exp in list)
{
    exp.Interpret(context);
}
Console.ReadKey();
目录
相关文章
|
12月前
|
设计模式 存储 Java
解释器模式(Interpreter Pattern)
解释器模式(Interpreter Pattern)是一种行为型设计模式,它定义了一种语言文法的表示,并定义了一个解释器,用于解释语言中的句子。
71 3
|
8月前
|
设计模式 自然语言处理 机器人
认真学习设计模式之解释器模式(Interpreter Pattern)
认真学习设计模式之解释器模式(Interpreter Pattern)
62 0
|
9月前
|
设计模式 SQL Java
设计模式~解释器模式(Interpreter)-19
解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。 目录 (1)优点: (2)缺点: (3)使用场景: (4)注意事项: (5)应用实例: 代码
53 0
行为型模式 - 解释器模式(Interpreter Pattern)
行为型模式 - 解释器模式(Interpreter Pattern)
|
设计模式 JavaScript 编译器
我学会了,解释器模式
解释器模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。
78 0
我学会了,解释器模式
|
设计模式 监控
行为型-Interpreter
解释器模式的原理和实现 命令模式的原理解读命令模式的英文翻译是 Command Design Pattern。在 GoF 的《设计模式》一书中,它是这么定义的:
91 0
|
设计模式 SQL JavaScript
Java解释器模式(Interpreter)
是一种不常用的设计模式 用于描述如何构成一个简单的语言解释器,主要用于使用面向对象语言开发的编译器和解释器设计。
|
C#
C#设计模式之二十三解释器模式(Interpreter Pattern)【行为型】
原文:C#设计模式之二十三解释器模式(Interpreter Pattern)【行为型】 一、引言   今天我们开始讲“行为型”设计模式的第十一个模式,也是面向对象设计模式的最后一个模式,先要说明一下,其实这个模式不是最后一个模式(按Gof的排序来讲),为什么把它放在最后呢?因为我们在业务系统中写一个解释器的机会并不是很多,实践比较少,理解和应用该模式就有些困难,所以就放在最后来说。
1307 0
|
Java 编译器 设计模式