一、什么是解释器模式?
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
如果在一个系统中需要匹配字符的需求在软件的很多地方都会使用,而且行为之间都非常类似,过去的做法是针对特定的需求,编写特定的函数,比如判断Email、匹配电话号码等等,与其为每一个特定需求都写一个算法函数,不如使用一种通用的搜索算法来解释执行一个正则表达式,该正则表达式定义了待匹配字符串的集合。而所谓的解释器模式,正则表达式就是他的一种应用,解释器为正则表达式定义了一个文法,如果表示一个特定的正则表达式,以及如何解释这个正则表达式。
Context:包含解释器之外的一些全局信息。
AbstractExpression:抽象表达式,声明一个抽象的解释操作,这个接口为抽象语法中所有的节点所共享。
TerminalExpression:终结符表达式,实现与文法中的终结符相关联的解释操作。
NonterminalExpression:非终结符表达式,为文法中的非终结符实现解释操作。对文法中每一条规则R1、R2……Rn都需要一个具体的非终结符表达式类。
二、有什么优点吗?
满足依赖倒转原则,对文法的扩展和维护带来方便
三、有什么缺点?
文法中的每一条规则至少定义了一个类,包含许多文法可能难以管理和维护;
四、什么时候应用呢?
当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时
五、代码展示
场景:让小菜用QB或者手机说明书中定义的规则去编写音乐程序,让一段文法去让QB或手机去翻译成具体的指令来执行。
①、解释器模式
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();