解释器模式(Interpretor)_java实现
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了解释器模式(Interpretor)_java实现,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3175字,纯文字阅读大概需要5分钟。
内容图文
![解释器模式(Interpretor)_java实现](/upload/InfoBanner/zyjiaocheng/607/06f2e61214d74e2faa65662b02050533.jpg)
//20200202
写在前面:刚期末考试完,考了面向对象,里边儿有23个设计模式,我寻思着考完挨个儿实现一下,本文实现解释器模式
解释器模式核心思想
- 构建语法树,然后将输入的值根据语法树执行
程序源代码:
- 此处实现一个加减运算的解释器,输入算式,输入参数,输出结果
import java.util.HashMap;
/**
* 每个运算符只需要管其旁边的两个参数即可
*/
public abstract class Expression {
//解析公式和数值,key是公式中的参数,value是具体的数值
public abstract int interpreter(HashMap<String,Integer> var);
}
import java.util.HashMap;
import java.util.Stack;
public class Caculator {
//定义表达式
private Expression expression;
//构造函数传参,并解析
public Caculator(String expstr){
//安排运算先后顺序
Stack<Expression> stack = new Stack<>();
//表达式拆分为字符数组
char[] cArray = expstr.toCharArray();
Expression left = null;
Expression right = null;
for(int i = 0;i<cArray.length;++i){
switch (cArray[i]){
case '+':
//加法
left = stack.pop();
right = new VarExpression(String.valueOf(cArray[++i]));
stack.push(new AddExpression(left,right));
break;
case '-':
//减法
left = stack.pop();
right = new VarExpression((String.valueOf(cArray[++i])));
stack.push(new SubExpression(left,right));
break;
default:
//运算式中变量
stack.push(new VarExpression(String.valueOf(cArray[i])));
break;
}
}
this.expression = stack.pop();
}
//计算
public int run(HashMap<String,Integer> var){
return this.expression.interpreter(var);
}
}
import java.util.HashMap;
/**
* 加法解释
*/
public class AddExpression extends SymbolExpression{
public AddExpression(Expression left,Expression right){
super(left,right);
}
public int interpreter(HashMap<String, Integer> var) {
return super.left.interpreter(var)+super.right.interpreter(var);
}
}
import java.util.HashMap;
/**
* 减法解析
*/
public class SubExpression extends SymbolExpression{
public SubExpression(Expression left,Expression right){
super(left,right);
}
public int interpreter(HashMap<String, Integer> var) {
return super.left.interpreter(var)-super.right.interpreter(var);
}
}
import java.util.HashMap;
/**
* 符号解析
*/
public class SymbolExpression extends Expression{
protected Expression left;
protected Expression right;
public SymbolExpression(Expression left,Expression right){
this.left = left;
this.right = right;
}
@Override
public int interpreter(HashMap<String, Integer> var) {
return 0;
}
}
import java.util.HashMap;
/**
* 参数解析
*/
public class VarExpression extends Expression{
private String key;
public VarExpression(String key){
this.key = key;
}
@Override
public int interpreter(HashMap<String, Integer> var) {
return var.get(this.key);
}
}
import java.util.HashMap;
import java.util.Scanner;
/**
* 测试主类
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入参数表达式(仅限加减运算):");
String expStr = sc.next();
Caculator caculator = new Caculator(expStr);
HashMap<String,Integer> map = new HashMap<>();
for(char ch : expStr.toCharArray()) {
if(ch != '+' && ch != '-' ) {
if(! map.containsKey(String.valueOf(ch))) {
System.out.print("请输入" + String.valueOf(ch) + "的值:");
String in = sc.next();
map.put(String.valueOf(ch), Integer.valueOf(in));
}
}
}
System.out.println(caculator.run(map));
}
}
- 输出如下:
至此,23个设计模式全部结束/撒花/??ヽ(°▽°)ノ?
以上
希望对大家有所帮助
内容总结
以上是互联网集市为您收集整理的解释器模式(Interpretor)_java实现全部内容,希望文章能够帮你解决解释器模式(Interpretor)_java实现所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。