其实没有什么好例子引入解释器模式它描述了如何构成个简单语言解释器主要应用在使用面向对象语言开发编译器中;在实际应用中我们可能很少碰到去构造个语言文法情况
虽然你几乎用不到这个模式但是看看还是能受到定启发
2、定义和结构
解释器模式定义如下:定义语言文法并且建立个解释器来解释该语言中句子它属于类行为模式这里语言意思是使用规定格式和语法代码
在GOF书中指出:如果种特定类型问题发生频率足够高那么可能就值得将该问题各个例子表述为个简单语言中句子这样就可以构建个解释器该解释器通过解释这些句子来解决该问题而且当文法简单、效率不是关键问题时候效果最好
这也就是解释器模式应用环境了
让我们来看看神秘解释器模式是由什么来组成吧
1) 抽象表达式角色:声明个抽象解释操作这个接口为所有具体表达式角色(抽象语法树中节点)都要实现
什么叫做抽象语法树呢?java和模式中给解释为:抽象语法树每个节点都代表个语句而在每个节点上都可以执行解释思路方法这个解释思路方法执行就代表这个语句被解释由于每个语句都代表这个语句被解释由于每个语句都代表个常见问题例子因此每个节点上解释操作都代表对个问题例子解答
2) 终结符表达式角色:具体表达式
a) 实现和文法中终结符相关联解释操作
b) 而且句子中每个终结符需要该类个例子和的对应
3) 非终结符表达式角色:具体表达式
a) 文法中每条规则R::=R1R2…Rn都需要个非终结符表带式角色
b) 对于从R1到Rn每个符号都维护个抽象表达式角色例子变量
c) 实现解释操作解释般要递归地表示从R1到Rn那些对象解释操作
4) 上下文(环境)角色:包含解释器的外些全局信息
5) 客户角色:
a) 构建(或者被给定)表示该文法定义语言中个特定句子抽象语法树
b) 解释操作
放上张解释器结构类图吧这也是来自于GOF书中
Division( Multiply(a , b), Add( Subtract(a , b) , c));
.out.prln("运算结果为:"+ex.erpret(con));
}
} 解释器模式并没有介绍说明如何创建个抽象语法树因此它实现可以多种多样在上面我们是直接在Test中提供当然还有更好、更专业实现方式
对于终结符GOF建议采用享元模式来共享它们拷贝它们要多次重复出现但是考虑到享元模式使用局限性我建议还是当你系统中终结符重复足够多时候再考虑享元模式
4、优缺点
解释器模式提供了个简单方式来执行语法而且容易修改或者扩展语法般系统中很多类使用相似语法可以使用个解释器来代替为每个规则实现个解释器而且在解释器中区别规则是由区别类来实现这样使得添加个新语法规则变得简单
但是解释器模式对于复杂文法难以维护可以想象下每个规则要对应个处理类而且这些类还要递归抽象表达式角色多如乱麻类交织在起是多么恐怖件事啊!
5、整理总结
这样对解释器模式应该有了些大体认识了吧由于这个模式使用案例匮乏所以本文大部分观点直接来自于GOF原著只是例子代码是亲自实现并调试通过
最新评论