解釋器模式實例


如下我們通過對算術表達式的解釋來看一個解釋器模式的實現, 解釋器模式的詳細說明見上一個博客https://www.cnblogs.com/fylove/p/9070338.html
如表達式m+n+p中,如果我們使用解釋器模式對該表達式進行解釋,那么m,n,p代表的三個字母可以看成是終結符號,而+代表的運算符則可以看成是非終結符號。

 

首先建立抽象解釋器表示數學運算

public abstract class ArithmeticExpression {

  public abstract int interptet();
}

 

解釋器中定義了interptet()方法,ArithmeticExpression有兩個直接子類,NumExpression,和OperatorExpression。

建立NumExpression,對數字進行解釋

public class NumExpression extends ArithmeticExpression {
  private int num;

  public NumExpression(int _num) {
    num = _num;
  }

  @Override public int interptet() {
    return num;
  }
}

 

建立OperatorExpression,對運算符進行解釋

public abstract class OperatorExpression extends ArithmeticExpression {
  protected ArithmeticExpression mArithmeticExpression1,mArithmeticExpression2;

  public OperatorExpression(ArithmeticExpression _arithmeticExpression1,
      ArithmeticExpression _arithmeticExpression2) {
    mArithmeticExpression1 = _arithmeticExpression1;
    mArithmeticExpression2 = _arithmeticExpression2;
  }
}

 

AdditionExpression,OperatorExpression的直接子類,加法運算解釋器

public class AdditionExpression extends OperatorExpression {
  public AdditionExpression(ArithmeticExpression _arithmeticExpression1,
      ArithmeticExpression _arithmeticExpression2) {
    super(_arithmeticExpression1, _arithmeticExpression2);
  }

  @Override public int interptet() {
    return mArithmeticExpression1.interptet() + mArithmeticExpression2.interptet();
  }
}

 

新增業務邏輯處理類,對於數字進行加法操作

public class Calculator {

  protected Stack<ArithmeticExpression> mArithmeticExpressionStack = new Stack<>();

  public Calculator(String expression) {
    ArithmeticExpression arithmeticExpression1, arithmeticExpression2;
    String[] elements = expression.split(" ");
    for (int i = 0; i < elements.length; ++i) {
      switch (elements[i].charAt(0)) {
        case '+':
          arithmeticExpression1 = mArithmeticExpressionStack.pop();
          arithmeticExpression2 = new NumExpression(Integer.valueOf(elements[++i]));
          mArithmeticExpressionStack.push(
              new AdditionExpression(arithmeticExpression1, arithmeticExpression2));
          break;
        default:
          mArithmeticExpressionStack.push(new NumExpression(Integer.valueOf(elements[i])));
          break;
      }
    }
  }

  public int calculate() {
    return mArithmeticExpressionStack.pop().interptet();
  }
}

 

客戶端調用

// 解釋計算123+124+125+126的運算結果
Calculator calculator = new Calculator("123+124+125+126");
Log.d(TAG, "setBtnClick: -->" + calculator.calculate());

 

這是一個簡單的解釋器模式,只對數字進行加法運算。同理,我們還可以寫出四則運算等程序。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM