设计模式笔记_行为型_解释器模式
1.解释器模式介绍
解释器模式(Interpreter Pattern)是一种行为型设计模式,它用于定义语言的语法表示,并且通过实现一个解释器来解析该语言的句子。它通常用于设计一个简单的语言解释器,或者在语法分析和编译器设计中使用。
类比场景:可以将解释器模式类比为一个简单的计算器,它能够解释和计算基本的数学表达式,比如“3 + 5”。在这个例子中,每一个数字和运算符都是语言的基本元素,解释器能够识别这些元素并执行相应的计算。
结构组成:解释器模式通常包括以下几个组件:
- 抽象表达式(AbstractExpression):定义解释操作的接口。
- 终结符表达式(TerminalExpression):实现与语法中的终结符相关的解释操作。
- 非终结符表达式(NonTerminalExpression):实现与语法中的非终结符相关的解释操作。
- 上下文(Context):包含解释器之外的全局信息。
优点和局限性:
- 优点:
- 易于实现简单的语言和语法。
- 可以通过组合表达式轻松扩展语言的功能。
- 局限性:
- 不适合复杂的语法结构,因为会导致类爆炸,难以维护。
- 性能可能较低,因为每个语法解析都需要创建新的表达式对象。
适用场景:
- 适用于简单的解析任务,如自定义脚本语言、简单数学表达式计算等。
- 不适合复杂语言解析器。
2.代码演示
演示场景: 模拟计算器,计算 x+(x-y) 的值。
抽象表达式(AbstractExpression):定义解释操作的接口
// 抽象表达式
public interface Expression {// context 为上下文信息int interpret(Map<String, Integer> context);
}
终结符表达式(TerminalExpression):实现与语法中的终结符相关的解释操作
// 终结符表达式
public class NumberExpression implements Expression {private String variable;public NumberExpression(String variable) {this.variable = variable;}@Overridepublic int interpret(Map<String, Integer> context) {return context.get(variable);}
}
非终结符表达式(NonTerminalExpression):实现与语法中的非终结符相关的解释操作
// 非终结符表达式
public class AddExpression implements Expression {private final Expression left;private final Expression right;public AddExpression(Expression left, Expression right) {this.left = left;this.right = right;}@Overridepublic int interpret(Map<String, Integer> context) {return left.interpret(context) + right.interpret(context);}
}public class SubtractExpression implements Expression {private final Expression left;private final Expression right;public SubtractExpression(Expression left, Expression right) {this.left = left;this.right = right;}@Overridepublic int interpret(Map<String, Integer> context) {return left.interpret(context) - right.interpret(context);}
}
客户端代码:
public class InterpreterClientDemo {public static void main(String[] args) {// 定义上下文Map<String, Integer> context = Map.of("x", 5, "y", 3);// 创建表达式Expression expression = new AddExpression(new NumberExpression("x"),new SubtractExpression(new NumberExpression("x"), new NumberExpression("y")));// 解释表达式int result = expression.interpret(context);System.out.println("Result: " + result); // 输出结果:Result: 7}
}
对应的类图: