java設計模式------解釋器模式

解釋器模式java

  • 概述 : 給定一個語言,定義它的文法表示,並定義一個解釋器,這個解釋器使用該標識來解釋語言中的句子.ide

  • 使用場景 : 若是一種特定類型的問題發生的頻率足夠高,那麼可能就值得將該問題的各個實例表述爲一個簡單語言中的句子.這樣就能夠構建一個解釋器,該解釋器經過解釋這些句子來解決該問題.oop

  • 解釋器模式的結構 :測試

    • 抽象解釋器 : 聲明一個全部具體表達式都要實現的抽象接口(或者抽象類),接口中主要是一個interpret()方法,成爲解釋操做.具體解釋任務由它的各個實現類來完成,this

    • 終結符表達式 : 實現與文法中的元素相關聯的解釋操做,一般一個解釋器模式中只有一個終結符表達式,但有多個實例,對應不一樣的終結符.終結符一半是文法中的運算單元.好比有一個簡單的公式R=R1+R2,在裏面R1和R2就是終結符,對應的解析R1和R2的解釋器就是終結符表達式.spa

    • 非終結符表達式 : 文法中的每條規則對應於一個非終結符表達式,非終結符表達式通常是文法中的運算符或者其餘關鍵字,好比公式R=R1+R2中,」+"就是非終結符,解析」+」的解釋器就是一個非終結符表達式.非終結符表達式根據邏輯的複雜程度而增長,原則上每一個問法規則都對應一個非終結符表達式.code

    • 環境角色 : 這個角色的任務通常是用來存放文法中各個終結符所對應的具體值,好比R=R1+R2,咱們給R1賦值1,給R2賦值2,這些信息須要存放到環境角色.接口

  • 優勢:get

    • 可擴展性比較好,靈活class

    • 增長了新的解釋表達式的方式

    • 易於實現簡單文法

  • 缺點:

    • 可利用場景比較小

    • 對於複雜的文法比較難維護

    • 解釋器模式會引發類膨脹

代碼實現

     示例 : 利用解釋器完成100-(1+1)的表達式.

 

抽象解釋器接口 

package InterpreterPattern;
 
/**
 * 
 */
public interface Interpreter {
  public int interpret(Context context);
}

非終結表達式類(+)

package InterpreterPattern;
 
/**
 * 
 */
public class Add implements Interpreter{
  @Override
  public int interpret(Context context) {
    //兩數相加
    return context.getNum1() + context.getNum2();
  }
}

非終結表達式類(-)

package InterpreterPattern;
 
/**
 * 
 */
public class Subtract implements Interpreter {
  @Override
  public int interpret(Context context) {
    //兩數相減
    return context.getNum1() - context.getNum2();
  }
}

環境角色類

package InterpreterPattern;
 

public class Context {
  private int num1;
  private int num2;
 
  public Context(int num1,int num2){
    this.setNum1(num1);
    this.setNum2(num2);
  }
 
  public int getNum1() {
    return num1;
  }
 
  public void setNum1(int num1) {
    this.num1 = num1;
  }
 
  public int getNum2() {
    return num2;
  }
 
  public void setNum2(int num2) {
    this.num2 = num2;
  }
}

測試類

package InterpreterPattern;
 
/**
 * Created by looper on 2017/9/7.
 */
public class InterpreterPatternTest {
  public static void main(String[] args) {
    //完成100 - (1+1) 算式
    int result = new Subtract().interpret(new Context(100,new Add().interpret(new Context(1,1))));
    System.out.println("result = "+result);
  }
}
相關文章
相關標籤/搜索