解释器模式
给定一个语言,定义它文法的一种表示,并定义一个解释器,来解释该语言表示的意思。
涉及到的角色描述:
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也是囫囵吞枣的学习了一遍,仅做笔记使用,文中如有不当之处 欢迎留言指出!!!