意图
给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子.
比如说对任何一种语言,已经把它语法的解释都已经解释出来了,接着这个语言的任何一个句子我都可以对它进行解释.
适用性
当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式.而当存在以下情况时该模式效果最好:该文法简单,对于复杂的文法,文法的类层次变得庞大而无法管理.此时语法分析程序生成器这样的工具是更好的选择.它们无需构建抽象语法树既可解释表达式,这样可以节省空间而且还可能节省时间.效率不是关键问题.
构成:
1.抽象表达式角色:声明一个所有的具体表达式角色都需要实现的抽象接口.这个接口主要是一个Interpreter()方法,称作解释操作.
2.终结符表达式角色:这是一个具体角色
--实现了抽象表达式角色所要求的接口,主要是一个Interpret()方法.
--文法中的每一个终结符都有一个具体终结表达式与之相对应.
3.非终结符表达式:这是一个具体角色
--实现了抽象表达式角色所要求的接口,主要是一个Interpret()方法
--解释操作以递归方式进行调用
(非终结符表达式可以包含若干个终结符表达式,就像一个枝节点可以包含若干个叶节点,两者之间是一种一对多的关系,非终结符表达式可以递归调用终结符表达式,还有一种情况就是非终结符表达式里面还可以包含若干个终结符表达式.)
4.环境角色:提供解释器之外的一些全局信息(对解释器提供额外的操作等)
5.客户端角色:调用解释操作Interpret.
对于一个布尔表达式它有多种可能,比如说:我们可以定义一个常量true或false,另外定义一个变量,这个变量可以稍后给它赋值,先定义好变量,具体值是什么可以最后给它赋上,并且还可以去改变它的值,还可以定义布尔表达式的与&&操作,或||操作,非!操作.
我们可以模拟一个具体的表达式,这个表达式就是一个布尔表达式,它可能是多个布尔表达式组成的一个整体,然后最终我们求得这个结果,里面肯定要涉及到若干的表达式的与,或,非,这里的每个操作都涉及到一个解释,比如两个bool表达式它们进行操作的时候,这就是一种解释器的行为,我们可以将这里面每种可能出现的情况都把它提取出来,作为我们的终结符表达式,比如说我们定义了与&&这样一个操作,那么这样就形成两个布尔表达式,它们具体结果是真还是假,我们是在终结符表达式里面执行的判断.
(图片看不清可点击得到图片原始大小)
ClassDiagram:
SequenceDiagram:
当调用非终结符表达式的时候,它又可以去调用它所包含的其他的非终结符表达式以及终结符表达式,通过这样一个递归的调用关系就实现了不断的解释这样一个过程.
InterpreterPattern示例意图:
解释布尔表达式的解释器,布尔表达式有多种情况比如:常量和常量,变量和变量,常量和变量, 相应的还有与(&&),或(||)非(!)几种操作,要把它们都实现出来,因此我要定义一个常量,一个变量,再去定义与And,或Or,非Not,这样几种操作,然后给出一个复杂的布尔表达式,通过所提供的解释器对给出复杂的布尔表达式进行解释,然后获得我想要的结果.
class Client { static void Main(string[] args) { Context context = new Context(); Variable x = new Variable("x"); Variable y = new Variable("y"); Constant c = new Constant(true); context.Assign(x, false); context.Assign(y, true); Expression exp = new Or(new And(c, x), new And(y, new Not(x))); Console.WriteLine("x={0}", x.Interpret(context)); Console.WriteLine("y={0}", y.Interpret(context)); Console.WriteLine("exp={0}", exp.Interpret(context)); Console.ReadKey(); } } /// <summary> /// 抽象表达式角色 /// </summary> public abstract class Expression { //抽象表达式角色依赖与环境角色来进行相应的解释. public abstract bool Interpret(Context context); } /// <summary> /// 环境角色 /// </summary> public class Context { //环境角色主要提供一些全局性的操作(通用的操作). //该例子定义的通用性的操作:定义一个变量给变量赋值,查找变量值. private Hashtable table = new Hashtable(); /*通过客户端定义变量给相应的变量赋值存放在HashTable里. * 该变量只有两种可能true和false; */ public void Assign(Variable var, bool value) { table.Add(var, value); } //取出变量的值. public bool Lookup(Variable var) { return (Boolean)table[var]; } } /// <summary> /// 终结符表达式角色 /// </summary> public class Variable : Expression { //该类定义了一个变量 /*它里面只能定义true和false所以它是一个 终结符表达式.*/ private string name; public Variable(string s) { name = s; } public override bool Interpret(Context context) { return context.Lookup(this); } } /// <summary> /// 终结符表达式角色 /// </summary> class Constant : Expression { //该类定义了一个常量 /*它里面只能定义true和false所以它是一个 终结符表达式.*/ bool value; public Constant(bool v) { value = v; } public override bool Interpret(Context context) { return value; } } /// <summary> /// 非终结符表达式 /// </summary> class And : Expression { //该类定义与(&&)的操作 /*非终结符表达式它里面会包含 若干个非终结符表达式及终结符表达式*/ Expression left; Expression right; public And(Expression l, Expression r) { left = l; right = r; } public override bool Interpret(Context context) { return left.Interpret(context) && right.Interpret(context); } } /// <summary> /// 非终结符表达式 /// </summary> class Or : Expression { //该类定义与(||)的操作 /*非终结符表达式它里面会包含 若干个非终结符表达式及终结符表达式*/ Expression left; Expression right; public Or(Expression l, Expression r) { left = l; right = r; } public override bool Interpret(Context context) { return left.Interpret(context) || right.Interpret(context); } } /// <summary> /// 非终结符表达式 /// </summary> class Not : Expression { //该类定义与(||)的操作, /*该类可包含一个终结符表达式或 非终结符表达式所以它是非终结符表达式*/ Expression exp; public Not(Expression e) { exp = e; } public override bool Interpret(Context context) { return !exp.Interpret(context); } }