解释器模式(Interpreter),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
结构
解释器模式的主要角色组成:
- Context(环境类):环境类又称为上下文类,它用于存储解释器之外的一些全局信息,通常它临时存储了需要解释的语句。
- AbstractExpression(抽象表达式):在抽象表达式中声明了抽象的解释操作,它是所有终结符表达式和非终结符表达式的公共父类。
- TerminalExpression(终结符表达式):终结符表达式是抽象表达式的子类,它实现了与文法中的终结符相关联的解释操作,在句子中的每一个终结符都是该类的一个实例。通常在一个解释器模式中只有少数几个终结符表达式类,它们的实例可以通过非终结符表达式组成较为复杂的句子。
- NonterminalExpression(非终结符表达式):非终结符表达式也是抽象表达式的子类,它实现了文法中非终结符的解释操作,由于在非终结符表达式中可以包含终结符表达式,也可以继续包含非终结符表达式,因此其解释操作一般通过递归的方式来完成。
优缺点
优点:
- 可扩展性好。
缺点:
- 对于复杂文法难以维护。
- 执行效率较低。
代码实现
Context(环境类)
public class Context {
private String input;
private String output;
public String getInput() {
return input;
}
public void setInput(String input) {
this.input = input;
}
public String getOutput() {
return output;
}
public void setOutput(String output) {
this.output = output;
}
}
AbstractExpression(抽象表达式)
public abstract class AbstractExpression {
public abstract void Interpret(Context context);
}
TerminalExpression(终结符表达式)
public class TerminalExpression extends AbstractExpression {
@Override
public void Interpret(Context context) {
System.out.println("终端解释器");
}
}
NonterminalExpression(非终结符表达式)
public class NonterminalExpression extends AbstractExpression {
@Override
public void Interpret(Context context) {
System.out.println("非终端解释器");
}
}
Client(客户端)
public class Client {
public static void main(String[] args) {
Context context = new Context();
List<AbstractExpression> list = new ArrayList<>();
list.add(new TerminalExpression());
list.add(new NonterminalExpression());
list.add(new TerminalExpression());
list.add(new TerminalExpression());
for (AbstractExpression abstractExpression : list) {
abstractExpression.Interpret(context);
}
}
}
控制台输出:
终端解释器
非终端解释器
终端解释器
终端解释器