Interpreter(解释器) 行为型 类 1
Intent_意图2
给定一个语言,定义它的方法表示 ,并定义一个解释器,这个解释器使用该标识来解释语言中的句子
Motivation_动机3
对于一些固定方法构建一个解释句子的解释器
Applicability_适用性4
当某种特定类型的问题发性频率足够高,就可值得将该问题的各个实例表述为一个简单语言中的句子。去构建一个解释器,该解释器通过解释这些句子来解决该问题
Structure_结构5
Participants_参与者6
- AbstractExpression(抽象表达式):定义解释器的接口,约定解释器的解释操作
- TerminalExpression(终结符表达式):抽象表达式的子类,用来实现方法中与终结符相关的操作
- NonterminalExpression(非终结符表达式):抽象表达式的子类,用来实现方法中与非终结符相关的操作
- Context(环境):通常包含各个解释器需要的数据或是公共功能
- Client(客户):调用解释器解释需要分析的句子或表达式
Collaborations_协作7
- AbstractExpression定义一个所有的具体表达式都需要实现的抽象接口
-> 主要包含一个interpret()方法,称做解释器方法 - TerminalExpression、NonterminalExpression实现AbstractExpression中所要求的接口
-> 方法中的每个终结符都有一个具体的TerminalExpression与之相对应
-> 方法中的每一条规则都需要一个具体的NonterminalExpression与之相对应
-> 例如公式:R=R1+R2中;R1和R2就是终结符,对应的解释R1和R2的解释器就是TerminalExpression,"+“就是非终结符,对应解释”+"的解释器就是一个NonterminalExpression - Context存放方法中各个终结符所对应的具体数据或公共功能
-> 例如公式:R=R1+R2中;给R1赋值100,给R2赋值200,这些信息应当存放到Context中
-> 一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取具体数据
-> 大多数情况下,使用Map来充当Context就足已 - Client将需要分析的句子或表达式,转换成使用解释器对象描述的抽象语法树,然后调用解释器的解释方法
-> 也可以通Context间接访问解释器的解释方法
Comsequences_结果8
- 优点
可扩展性较好、灵活
增加了新的解释表达式的方式
易于实现简单方法 - 缺点
可利用场景较少
对于复杂的文法比较难维护
解释器模式会引起类膨胀
解释器模式采用递归调用方法 - 用途
可以将一个需要解释执行的语言中的句子表示为一个抽象语法树
一些重复出现的问题可以用一种简单的语言来进行表达
一个简单语法需要解释的场景
Implementation/Sample Code_实现/范例代码910
Implementation
Expression
public abstract class AbstractExpression {
/**
* 解释的操作
**/
public abstract void interpret(Context ctx);
}
TerminalExpression
public class TermianlExpression extends AbstractExpression {
public void interpret(Context ctx) {