
设计模式之备忘录模式
模式定义
解释器模式(Interpreter Pattern)是行为型设计模式之一,用于定义一个语言的文法,并创建解释器来解释该语言中的句子。它适用于某些特定领域的语言解析,如数学表达式、正则表达式、SQL解析等。
角色与结构
解释器模式通常由以下几个核心角色组成:
1️⃣ 抽象表达式(Abstract Expression)
- 定义解释器的接口,所有的解释器都需要实现这个接口。
2️⃣ 终结符表达式(Terminal Expression)
3️⃣ 非终结符表达式(Non-Terminal Expression)
- 组合多个终结表达式,构成复杂的解析逻辑,如加法、乘法等运算。
4️⃣ 上下文(Context)
5️⃣ 客户端(Client)
- 构造抽象语法树(AST),并调用解释器解析表达式。
适用场景
- 编译器、解释器(如SQL解析器、数学公式解析器)
- 正则表达式解析(如Pattern.compile(“a*b”))
- 命令脚本解析(如计算器应用、命令模式)
- 语法树解析(如XML/JSON解析器)
代码示例(Java实现)
示例:实现一个简单的数学表达式解释器(支持加法和乘法)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| interface Expression { int interpret(); }
class NumberExpression implements Expression { private int number;
public NumberExpression(int number) { this.number = number; }
@Override public int interpret() { return number; } }
class AddExpression implements Expression { private Expression left, right;
public AddExpression(Expression left, Expression right) { this.left = left; this.right = right; }
@Override public int interpret() { return left.interpret() + right.interpret(); } }
class MultiplyExpression implements Expression { private Expression left, right;
public MultiplyExpression(Expression left, Expression right) { this.left = left; this.right = right; }
@Override public int interpret() { return left.interpret() * right.interpret(); } }
public class InterpreterPatternDemo { public static void main(String[] args) { Expression three = new NumberExpression(3); Expression five = new NumberExpression(5); Expression add = new AddExpression(three, five); Expression two = new NumberExpression(2); Expression multiply = new MultiplyExpression(add, two);
System.out.println("计算结果: " + multiply.interpret()); } }
|
解释器模式的优缺点
✅ 优点:
•可扩展性强:支持扩展新的语法规则(新增表达式类)。
•符合 OCP(开放封闭原则):修改语法不会影响已有的代码。
•代码结构清晰:符合语言的文法结构,易于理解。
❌ 缺点:
•效率低:对于复杂语法来说,构建 AST 可能会导致性能下降。
•代码复杂度高:需要定义大量的类来表示不同的语法规则。
•不适用于复杂的语法:一般适用于简单语言,复杂解析通常使用编译原理技术(如 ANTLR、Lex/Yacc)。
总结
1️⃣ 解释器模式用于解析和执行语言表达式,适用于领域特定语言(DSL)。
2️⃣ 适用于简单的语法解析,但对于复杂语言通常使用专门的解析工具。
3️⃣ 核心思想:构造 AST(抽象语法树),递归解析表达式。