今天我們要將前兩篇的隨筆總結一下,用面向對象的思想封裝一下,使它能夠更容易的擴展。
首先我們要設計一個類,讓他能夠同時表示操作符和操作數
public enum OperationType { /** * 操作值 */ VALUE, /** * 操作符 */ SYMBOL; }
這里的操作數不是我們設計的問題所在,主要是操作符,我們操作符設計成這樣
flag():操作符的指定標識
priority():操作符的優先級
numOfSymbol():需要參與運算的操作數個數
operation():將結果封裝成Operation
cal():計算結果
示例代碼:
/** * 加號操作符 * * @author sbtufss * */ public class PlusSymbol extends Symbol { @Override public String flag() { return "+"; } @Override public SymbolPriority priority() { return SymbolPriority.PLUS; } @Override public int numOfSymbol() { return 2; } @Override public double cal(double[] values) { // TODO Auto-generated method stub return values[0] + values[1]; } }
而,到了這一步,我們還需要一個操作符管理器,來告訴表達式,我能處理那些操作符
然后我們來看一下他的子類CommonSymbolManager.java
/** * 管理操作符字符串所對應的操作符類 * * @author sbtufss * */ public class CommonSymbolManager extends SymbolManager { public CommonSymbolManager() { super(); list.add(new PlusSymbol()); list.add(new ReduceSymbol()); list.add(new MultSymbol()); list.add(new DivideSymbol()); } }
這個類默認添加了加減乘除這四個操作符,而我們要添加自己自定義的操作符時,應該怎么辦呢?
實際上我們只需要在處理字符串表達式之前來添加進去就行了,ok,上代碼
public static void main(String[] args) { Calculator calculator = new Calculator(); calculator.getSymbolManager().add(new MathPowSymbol());//添加自定義的操作符 calculator.handleStr("(2+3.2)+Math.pow(3,2)*(40-5+(-1)*4)"); }
運行結果
相關源碼在github上面:
git地址https://github.com/sbtufss/calculate.git