解释器模式(InterpreterPattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。简单地说,Interpreter模式是一种简单的语法解释器构架。
解决问题:对于一些固定文法构建一个解释句子的解释器。
解决方式:
构件语法树,定义终结符与非终结符。构件环境类,包含解释器之外的一些全局信息,一般是HashMap。
使用场景:
1、可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。
2、一些重复出现的问题可以用一种简单的语言来进行表达。
3、一个简单语法需要解释的场景。
应用实例:编译器、运算表达式计算。
解释器模式UML图:角色和职责:
Context:解释器上下文环境类。用来存储解释器的上下文环境,比如需要解释的文法等。
AbstractExpression :解释器抽象类。
ConcreteExpression:解释器具体实现类。
代码示例:
/** * @author arain.liu *上下文环境类,用来保存文法 */ public class Context { private String input; private int output; public Context(String input){ this.input = input; } public String getInput() { return input; } public void setInput(String input) { this.input = input; } public int getOutput() { return output; } public void setOutput(int output) { this.output = output; } } /** * 抽象解释器 * @author arain.liu */ public abstract class Expression { public abstract void interpret(Context context); } /** * 减法解释器 * @author arain.liu * */ public class MinusExpression extends Expression { @Override public void interpret(Context context) { System.out.println("自动递减"); String input = context.getInput(); int intInput = Integer.valueOf(input); --intInput; context.setInput(String.valueOf(intInput)); context.setOutput(intInput); } } /** * 加法解释器 * @author arain.liu */ public class PlusExpression extends Expression { @Override public void interpret(Context context) { System.out.println("自动递增");; //获得上下文环境 String input = context.getInput(); //进行类型转换 int intInput = Integer.valueOf(input); //进行递增 ++intInput; //对上下文环境重新进行赋值 context.setInput(String.valueOf(intInput)); context.setOutput(intInput); } } public class MainClass { public static void main(String[] args) { String name = "20"; Context context = new Context(name); List<Expression> list = new ArrayList<Expression>(); list.add(new PlusExpression()); list.add(new PlusExpression()); list.add(new MinusExpression()); list.add(new MinusExpression()); list.add(new MinusExpression()); list.add(new MinusExpression()); for(Expression ex : list){ ex.interpret(context); System.out.println(context.getOutput()); } } }优缺点:
优点:
1、可扩展性比较好,灵活。
2、增加了新的解释表达式的方式。
3、易于实现简单文法。
缺点:
1、可利用场景比较少。
2、对于复杂的文法比较难维护。
3、解释器模式会引起类膨胀。
4、解释器模式采用递归调用方法。