解释器模式
解释器模式(Interpreter Pattern):定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,这里的“语言”是指使用规定格式和语法的代码。解释器模式是一种类行为型模式
示例1
- Context;包含解释器之外的一些全局信息
public class Context {
private String before;
private String after;
public String getBefore() {
return before;
}
public void setBefore(String before) {
this.before = before;
}
public String getAfter() {
return after;
}
public void setAfter(String after) {
this.after = after;
}
}
- AbstractExpression:抽象解释器
public abstract class AbstractExpression {
abstract void Interpret(Context context);
}
- TerminalExpression: 为终结符表达式, 实现与文法中的终结符相关的解释操作
public class TerminalExpression extends AbstractExpression {
@Override
void Interpret(Context context) {
String before = context.getBefore();
context.setAfter("被终端处理后:" + before);
System.out.println(context.getAfter());
}
}
- NonTermialExpression: 为非终结符表达式,为文法中的非终结符实现解释操作
public class NonterminalExpression extends AbstractExpression {
@Override
void Interpret(Context context) {
String before = context.getBefore();
context.setAfter("被非终端处理后:" + before);
System.out.println(context.getAfter());
}
}
- 测试类
public class Interpreter01Test {
public static void main(String[] args) {
Context context = new Context();
context.setBefore("test");
TerminalExpression terminalExpression = new TerminalExpression();
terminalExpression.Interpret(context);
NonterminalExpression nonterminalExpression = new NonterminalExpression();
nonterminalExpression.Interpret(context);
/**
* 被终端处理后:test
* 被非终端处理后:test
*/
}
}
总结
-
优点
- 当有一个语言需要解释执行,可将该语言中的句子表示为一个抽象语法树,就可以考虑使用解释器模式,让程序具有良好的扩展性
- 增加新的解释表达式较为方便
-
缺点
- 对于复杂文法难以维护。在解释器模式中,每一条规则至少需要定义一个类,因此如果一个语言包含太多文法规则,类的个数将会急剧增加,导致系统难以管理和维护
- 执行效率低
-
适用场景
- 可以将一个需要解释执行的语言中的句子表示为一个抽象语法树
-
应用场景
- 编译器
- 运算表达式计算
- 正则表达式
- 机器人
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。