設計模式(十七):解釋器模式

 

優勢:正則表達式

  ① 若是一個特定問題發生頻率夠高,就值得將其實例表述(解釋爲)爲一個簡單語言的句子,如用正則表達式匹配手機號,油箱等express

  ② 必須已有一種語言,以後,先定義其文法表示,而後定義其解釋器,用解釋器來解釋此語言中的句子spa

缺點:code

  ① 此模式爲文法中的每一條規則至少定義了一個類,所以包含了許多規則的文法可能難以管理和維護。blog

適用範圍:接口

   特定類型的問題發生的頻率足夠高,就能夠考慮將其表述爲一個簡單語言句子get

客戶端:string

  Content text = new Content();it

  //音樂-上海灘
  System.out.println("上海灘:");io

  //待解釋的音符串
  text.setText("T 500 O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 ");

  //抽象解釋器接口

  AbstractExpression expression = null;

  try {
    while(text.getText().length()>0){
      String str = text.getText().substring(0,1); 
      switch (str){
        //演奏速度
        case "T":
          expression = new TerminalExpression3();
          break;
        //音階
        case "O":
          expression = new TerminalExpression2();
          break;
        //音符
        case "A":
        case "B":
        case "C":
        case "D":
        case "E":
        case "F":
        case "G":
          expression = new TerminalExpression1();
          break;
      }

      // 解釋,每次截取一個字母+數值(即標識+值),不斷循環截取解釋
      expression.interpret(text);
    }
   } catch (Exception e) {
    e.printStackTrace();
   }

   //打印結果:

   上海灘:

   中速 中音 5 7 1 5 7 4 5 7 1 高音 3 中音 1 7 3 5 4

        /**
         * AbstractExpression 抽象表達式類 (抽象解釋類)  -- 獲取標識和值,及解釋的方法,由實例化對其進行具體解釋
         * TerminalExpression1 TerminalExpression2 TerminalExpression3 (音符、音階、演奏速度)  NoTerminalExpression(其餘)  -- 都是AbstractExpression的實例化  
         * Content 演奏內容  -- 標識和值的集合
         */
相關文章
相關標籤/搜索