解释器模式(Interpreter)
- 定义 : 给定一个语言, 定义它的文法的一种表示, 并定义一个解释器, 这个解释器使用该表示来解释语言中的句子
- 为了解释一种语言, 而为语言创建的解释器
- 类型 : 行为型
适用场景
- 某个特定类型问题发生频率足够高
优点
- 语法由很多类表示, 容易改变及扩展此"语言"
缺点
- 当语法规则数目太多时, 增加了系统复杂度
模式角色
-
AbstractExpression (抽象表达式 ) : 声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。
-
TerminalExpression (终结符表达式) :
- 实现与文法中的终结符相 关联的解释操作。
- 一个句子中的每个终结符需要该类的一个实例。
-
NonterminalExpression (非终结符表达式) :
- 对文法中的每一条规则R ::= R1 R1 . . . Rn 都需要一个NonterminalExpression 类。
为从R1到Rn的每个符号都维护一个AbstractExpression类型的实例变量。
为文法中的非终结符实现解释 ( Interpret)操作。解释(Interpret)一般要递归地调用表示R1到Rn的那些对象的解释操作。
- 对文法中的每一条规则R ::= R1 R1 . . . Rn 都需要一个NonterminalExpression 类。
-
Context(上下文): 包含解释器之外的一些全局信息。
-
Client (客户):
- 构建(或被给定) 表示该文法定义的语言中一个特定的句子的抽象语法树。该抽象语
法树由NonterminalExpression 和TerminalExpression的实例装配而成。 - 调用解释操作。
- 构建(或被给定) 表示该文法定义的语言中一个特定的句子的抽象语法树。该抽象语
代码实现
- 实际开发中需要使用解释器模式的地方很少, 这里就不手动实现了, 就以JDK的Pattern类来说明一下即可
- Pattern类可以认为是解释器模式的一种实现, 它实现对正则表达式的解析
- 如对$符合的解析可以认为是TerminalExpression解释器
本文参考:
慕课网<java设计模式精讲 Debug 方式+内存分析>课程
四人帮<设计模式>