解释器模式
给定一个语言,定义它文法的一种表示,并定义一个解释器,来解释该语言表示的意思。
涉及到的角色描述:
AbstractExpression: 抽象表达式,声明一个抽象的解释操作父类,定义一个抽象的解释方法,具体的实现由子类解释器完成/
TerminalExpression: 终结符表达式,实现文法中与终结符有关的解释操作,文法中每一个终结符都有一个具体的终结表达式与之对应
NonterminalExpression: 非终结符表达式,实现文法中与非终结符有关的解释操作
Context: 上下文环境类,包含解释器之外的全局信息
Client: 客户端,解析表达式,构建抽象语法树,执行具体的解释操作等.
优点
- 灵活性强,易于改变和扩展文法
缺点
- 因为每一条文法都可以对应至少一个解释器,会生成大量的类,导致后期维护困难,而且对应复杂的文法,构建语法树会显得异常繁琐.
具体实现实例
采用解释器模式解释“1+2+7”具体表达
抽象表达式
package com.chenpt.designModel.interpreterModel; /** * @Author: chen * @Description: 抽象解释器 * @Date: created in 2018/8/22 * @Modified By: */ public interface ArithmeticExpression { int interpret(); }
终结符表达式
package com.chenpt.designModel.interpreterModel; /** * @Author: chen * @Description: 对运算符进行解释 * @Date: created in 2018/8/22 * @Modified By: */ public class OperatorExpression implements ArithmeticExpression { private ArithmeticExpression expression1,expression2; OperatorExpression(ArithmeticExpression expression1,ArithmeticExpression expression2){ this.expression1=expression1; this.expression2=expression2; } @Override public int interpret() { return expression1.interpret()+expression2.interpret(); } }
非终结表达式来解释该表达式的值
package com.chenpt.designModel.interpreterModel; /** * @Author: chen * @Description: 对数字进行解释 * @Date: created in 2018/8/22 * @Modified By: */ public class NumExpression implements ArithmeticExpression { private int num; NumExpression(int num){ this.num=num; } @Override public int interpret() { return num; } }
具体实现
package com.chenpt.designModel.interpreterModel; import java.util.Stack; /** * @Author: chen * @Description: 业务处理类 * @Date: created in 2018/8/22 * @Modified By: */ public class Calculator { Stack<ArithmeticExpression> expressions = new Stack<>(); Calculator(String content){ ArithmeticExpression arithmeticExpression1, arithmeticExpression2; String[] elements = content.split(""); for (int i = 0; i < elements.length; ++i) { switch (elements[i].charAt(0)) { case '+': arithmeticExpression1 = expressions.pop(); arithmeticExpression2 = new NumExpression(Integer.valueOf(elements[++i])); expressions.push( new OperatorExpression(arithmeticExpression1, arithmeticExpression2)); break; default: expressions.push(new NumExpression(Integer.parseInt(elements[i]))); break; } } } public int calculate() { return expressions.pop().interpret(); } }
客户端
package com.chenpt.designModel.interpreterModel; /** * @Author: chen * @Description: * @Date: created in 2018/8/23 * @Modified By: */ public class MainTest { public static void main(String[] args){ Calculator calculator = new Calculator("1+2+7"); System.out.println("结束="+calculator.calculate()); } } //结果 结束=10
此模式lz也是囫囵吞枣的学习了一遍,仅做笔记使用,文中如有不当之处 欢迎留言指出!!!