文章目录
解释器模式( Interpreter Pattern)
**解释器模式(Interpreter Pattern)**属于行为型模式。
什么是解释器模式(Interpreter Pattern)?
这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。
UML
角色
- 抽象表达式(IExpression)角色:负责定义一个解释方法,并交由具体子类进行具体解释。
- 终结符表达式(TerminalExpression)角色:实现文法中与终结符有关的解释操作,该操作可以理解为最底层的解释逻辑,不再下钻。通常一个解释器中只有一个终结符表达式,但有多个实例,对应不同的终结符。
- 非终结符表达式(NonterminalExpression)角色:实现文法中与非终结符有关的解释操作(过程逻辑),通常会进行解析并继续下钻调用,直到终结符表达式。
- 上下文环境类(Context)角色:包含解释器之外的全局信息。它一般用来存放文法中各个终结符所对应的具体值。
应用
使用模板
//client
public class InterpreterPattern {
public static void main(String[] args) {
Context context = new Context();
context.operation("被解析数据");
}
}
//抽象表达式
interface IExpression {
//定义通用的表达式接口
Object interpret(String info);
}
//终结符表达式
class TerminalExpression implements IExpression {
//定义终结符解析逻辑
@Override
public Object interpret(String info) {
return "【终结符表达式】正在对(" + info + ")执行最终解析...\n" + "解析完毕!";
}
}
//非终结符表达式
class NonTerminalExpression implements IExpression {
private final IExpression expression;
//设置其他表达式
public NonTerminalExpression(IExpression expression) {
this.expression = expression;
}
//定义非终结符表达式解析逻辑
@Override
public Object interpret(String info) {
System.out.println("【非终结符表达式】解析中...");
return expression.interpret(info);
}
}
//上下文
class Context {
private final IExpression expression;
//设置具体表达式逻辑
Context() {
expression = new NonTerminalExpression(new TerminalExpression());
}
//执行解析操作
public void operation(String info) {
System.out.println(expression.interpret(info));
}
}
为什么要使用解释器模式?
在软件开发中,会遇到有些问题多次重复出现,而且有一定的相似性和规律性。如果将它们归纳成一种简单的语言,那么这些问题实例将是该语言的一些句子,便可以用解释器模式来实现。
优缺点
优点:
- 解析逻辑可扩展性比较好,灵活。
- 易于实现简单文法。
缺点:
- 可利用场景比较少。
- 对于复杂的文法比较难维护。过于复杂的语法并不适合解释器模式。
- 解释器模式会引起类膨胀。过多的解析式会让解析器有过多的类。
- 解析速度较慢,解释器模式采用递归调用方法。
怎样使用解释器模式?
使用较少,可以使用jep
进行设计
使用场景
- 当语言的文法较为简单,且执行效率不是关键问题时。
- 一些重复出现的问题可以用一种简单的语言进行表达。
- 当一个语言需要解释执行,并且语言中的句子可以表示为一个抽象语法树。