日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

解释器模式详解

發布時間:2024/7/23 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解释器模式详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Expression.java?

public interface Expression {// 解析公式和數值,其中var 中的key 值是公式中的參數,value 值是具體的數字.public int interpreter(final Map<String, Integer> var); }

VarExpression.java

public class VarExpression implements Expression {private String key;public VarExpression(final String key) {this.key = key;}/*** 從map中取值.*/@Overridepublic int interpreter(Map<String, Integer> var) {return var.get(this.key);}}

SymbolExpression.java

public abstract class SymbolExpression implements Expression {protected Expression left;protected Expression right;public SymbolExpression(final Expression left, final Expression right) {this.left = left;this.right = right;}@Overridepublic abstract int interpreter(Map<String, Integer> var);}

AddExpression.java

public class AddExpression extends SymbolExpression {/*** @param newLeft* @param newRight*/public AddExpression(Expression left, Expression right) {super(left, right);}/*** {@inheritDoc}*/@Overridepublic int interpreter(Map<String, Integer> var) {return left.interpreter(var) + right.interpreter(var);}}

SubExpression.java

public class SubExpression extends SymbolExpression {/*** @param newLeft* @param newRight*/public SubExpression(Expression left, Expression right) {super(left, right);}/*** {@inheritDoc}*/@Overridepublic int interpreter(Map<String, Integer> var) {return left.interpreter(var) - right.interpreter(var);}}

Calculator.java

public class Calculator {// 定義表達式.private Expression expression;public Calculator(final String expr) {// 定義一個棧,安排運算的先后順序.final Stack<Expression> stack = new Stack<>();char[] charArray = expr.toCharArray();// 運算.Expression left = null;Expression right = null;for (int i=0; i<charArray.length; i++) {switch(charArray[i]) {case '+':left = stack.pop();right = new VarExpression(String.valueOf(charArray[++i]));stack.push(new AddExpression(left, right));break;case '-':left = stack.pop();right = new VarExpression(String.valueOf(charArray[++i]));stack.push(new SubExpression(left, right));break;default:stack.push(new VarExpression(String.valueOf(charArray[i])));}}// 把運算結果拋出來.this.expression = stack.pop();}/*** 開始運算.* @param var* @return*/public int run(Map<String, Integer> var) {return this.expression.interpreter(var);} }

Client.java

public class Client {/*** @param args*/public static void main(String[] args) {String expr = readExpressionString();Map<String, Integer> var = getValue(expr);Calculator cal = new Calculator(expr);System.out.println("運算結果為:" + expr + "=" + cal.run(var));}/*** 獲得表達式.* @return*/public static String readExpressionString() {System.out.println("請輸入表達式:");return readLine();}private static String readLine() {try {final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));return reader.readLine();} catch (IOException e) {throw new RuntimeException(e.getMessage(), e);}}public static Map<String, Integer> getValue(final String expr) {Map<String, Integer> map = new HashMap<>();for(char c : expr.toCharArray()) {if (c != '+' && c != '-') {if (!map.containsKey(String.valueOf(c))) {String in = readLine();map.put(String.valueOf(c), Integer.valueOf(in));}}}return map;} }

總結

以上是生活随笔為你收集整理的解释器模式详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。