设计模式 之 解释器模式
介绍
角色:
主要包含如下几个角色:
- Expression: 抽象表达式。
- TerminalExpression: 终结符表达式 - 就是符号表达式。
- NonTerminalExpression: 非终结符表达式 - 数字表达式。
- Calculator: 计算类。
代码
代码场景
解释器来实现加、减运算。
具体代码
Expression
/** * 抽象解释器 AbstractExpression * @author GaoYuan * @date 2018/11/11 上午8:38 */public abstract class Expression { /** 解释动作 */ public abstract int interpret();}
ValueExpression - 解释 数字
/** * 数字解释器(具体值) TerminalExpression * @author GaoYuan * @date 2018/11/11 上午8:44 */public class ValueExpression extends Expression { private int value; public ValueExpression(){} public ValueExpression(int value){ this.value = value; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } @Override public int interpret() { return this.value; }}
SymbolExpression - 解释 运算符(抽象)
/** * 运算符 解释器 NonterminalExpression * @author GaoYuan * @date 2018/11/11 上午8:43 */public abstract class SymbolExpression extends Expression { /** 左结果 */ protected Expression left; /** 右结果 */ protected Expression right; public SymbolExpression(Expression left, Expression right) { this.left=left; this.right=right; }}
具体运算符的解释类
/** * 加法 * @author GaoYuan * @date 2018/11/11 下午1:43 */public class AddExpression extends SymbolExpression { /** 这里肯定传入的是值类型,而不是符号 */ public AddExpression(Expression left, Expression right){ super(left, right); } @Override public int interpret() { // left解释成left的值,right解释成right的值 return left.interpret() + right.interpret(); }}/** * 减法 * @author GaoYuan * @date 2018/11/11 下午1:43 */public class SubExpression extends SymbolExpression { /** 这里肯定传入的是值类型,而不是符号 */ public SubExpression(Expression left, Expression right){ super(left, right); } @Override public int interpret() { // left解释成left的值,right解释成right的值 return left.interpret() - right.interpret(); }}
Calculator - 计算类,解释完后需要进行计算
/** * 计算 * @author GaoYuan * @date 2018/11/11 下午1:50 */public class Calculator { /** * 计算 * @author GaoYuan * @date 2018/11/11 下午2:01 */ public int calculator(String statement){ Expression left; Expression right; // 用于存储当前已经计算的值 Expression now = null; // 空格隔开的数据,进行截取成数组 String[] strs = statement.split(" "); for(int i=0;i
测试类
public static void main(String[] args){ String statement = "1 + 2 + 3 - 5"; Calculator calculator = new Calculator(); int result = calculator.calculator(statement); System.out.println(statement + " = " + result);}
输出
1 + 2 + 3 - 5 = 1
优缺点
优点:
- 符号解释类可扩展,比如可以添加乘法、除法等运算符
- 可用于对SQL的解释等。
缺点:
- 因为需要解释的过程,所以比较耗时。
- 表达式过长就不易于维护。
- 场景比较少。
码云
博客
欢迎关注我的个人微信订阅号:(据说这个头像程序猿专用)