解释器模式是行为型模式的一种。给定一个语言(如由abcdef六个字符组成的字符串集合),定义它的文法的一种表示(S::=abA*ef,A::=cd)并定义一个解释器,解释器使用该表示来解释语言中的句子.其中的解释器类似一个翻译机

角色和职责:

1.抽象解释器(AbstractExpression):

维护对行为实现(Implementor)的引用

2.终结符解释器(TerminalExpression) -AddExpression:

3.非终结符解释器(NonterminalExpression)-NumberExpression:

4.上下文环境(Context):

UML图:

具体代码:

/**
* 抽象解释器
*/
public interface AbstractExpression {
int interptet();//处理
}
/**
* 数字类
*/
public class NumberExpression implements AbstractExpression{
private int number;
public NumberExpression(int number){
this.number = number;
} @Override
public int interptet() {
return number;
}
}
/**
* 运算类
*/
public class AddExpression implements AbstractExpression{
private AbstractExpression expression1;
private AbstractExpression expression2;
public AddExpression(AbstractExpression expression1,AbstractExpression expression2){
this.expression1 = expression1;
this.expression2 = expression2;
} @Override
public int interptet() {
return expression1.interptet() + expression2.interptet();
}
}
import java.util.Stack;

/**
* 上下文,解释器
*
*/
public class Context {
Stack<AbstractExpression> stack = new Stack<AbstractExpression>();
public Context(String str){
String strs[] = str.split(" ");
for(int i=0;i<strs.length;i++){
switch (strs[i]){
case "+":
AbstractExpression number1 = stack.pop();
AbstractExpression number2 = new NumberExpression(Integer.parseInt(strs[++i]));
stack.push(new AddExpression(number1,number2));
break;
default:
stack.push(new NumberExpression(Integer.parseInt(strs[i])));
break;
}
}
} public int calculate(){
return stack.pop().interptet();//计算结果
}
}
public class Main {
public static void main(String[] args) {
Context context = new Context("22 + 33 + 44");
int result = context.calculate();//计算结果
System.out.println("计算结果:"+result);
}
}

结果:

计算结果:99

优缺点:

优:灵活性强,如上边的例子,当我们想对文法规则进行扩展延伸时,只需要增加相应的非终结符解释器,并在构建语法树的时候使用新增的解释器对象进行具体的解释即可.

缺:因为每一条文法都可以对应至少一个解释器,会生成大量的类,导致后期维护困难,而且对应复杂的文法,构建语法树会显得异常繁琐.

源码地址:https://github.com/qjm201000/design_pattern_interpreter.git

最新文章

  1. #ifndef
  2. 使用as3控制动画的播放与暂停
  3. 正则表达式之IP地址检验
  4. SG函数
  5. hihoCoder 1385 A Simple Job
  6. [转] AE之分级颜色专题图渲染
  7. 利用css3-animation来制作逐帧动画
  8. JS高级程序设计学习笔记之Date类型
  9. Zookeeper笔记1-CAP/BASE理论
  10. Hama顶点编程
  11. Spark:将DataFrame写入Mysql
  12. DBC格式解析(数据部分)
  13. w97常用功能代码
  14. zabbix配置短信告警
  15. iperf测试工具
  16. Redis位图实现用户签到功能
  17. python 文件目录遍历
  18. [转]ASP.NET Core配置环境变量和启动设置
  19. 【转】每个 Linux 新手都应该知道的 10 个命令
  20. Mysql04

热门文章

  1. WPF在3D Cad模型中利用TextureCoordinates实现颜色渐变显示偏差值的变化
  2. MQTT是IBM开发的一个即时通讯协议,构建于TCP/IP协议上,是物联网IoT的订阅协议,借助消息推送功能,可以更好地实现远程控制
  3. SourceTree 免注册使用
  4. WPF中任意Object的XAML代码格式化输出
  5. WPF 流打印
  6. 【C#】VS2012+InstallShield2013制作软件更新包
  7. .NET与 java通用的3DES加密解密方法
  8. Vue-cli入门(一)——项目搭建
  9. Win8 Metro(C#)数字图像处理--2.71Sigma平滑滤波器
  10. 问题记录,Release模式和Debug运行效果不一样,Release必须加延时