1. 程式人生 > >解釋器模式-Interpreter

解釋器模式-Interpreter

解釋 exp 語法 contex 比較 nts 決定 erp 可能

解釋器模式:給定一個語言,定義它的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子.

解釋器模式的作用:如果一個特定類型的問題發生的頻率夠高,那麽可能就值得將該問題的各個實例表述為一個簡單語言中的一個特定的句子.這樣就可以構建一個解釋器,該解釋器通過解釋這些句子來解決該問題.

解釋器模式的優缺點:

  • 優點:容易地改變和擴展文法,因為該模式使用類來表示文法規則,你可以使用繼承來改變和擴展該文法.也比較容易實現文法,因為定義抽象語法樹中的各個節點的類的表示大體類似,這些類都易於直接編寫.
  • 缺點:解釋器模式為文法中的每一條規則至少定義了一個類,因此包含許多規則的文法可能難以管理和維護.

解釋器模式結構圖:

技術分享

代碼實現:

1 package com.cgj.pattern.interpreter;
2 
3 /**
4  * 聲明一個抽象的解釋操作,這個接口為抽象語法樹中所有節點所共享.
5  */
6 public interface AbstractExpression {
7 
8     public abstract void interpret(Context context);
9 }
 1 package com.cgj.pattern.interpreter;
 2 
 3 public class AExpression implements AbstractExpression {
4 5 @Override 6 public void interpret(Context context) { 7 System.out.println("解釋器A"); 8 } 9 10 }
 1 package com.cgj.pattern.interpreter;
 2 
 3 public class BExpression implements AbstractExpression {
 4 
 5     @Override
 6     public void interpret(Context context) {
7 System.out.println("解釋器B"); 8 } 9 10 }
 1 package com.cgj.pattern.interpreter;
 2 
 3 /**
 4  * 包含解釋器之外的一些全局信息
 5  */
 6 public class Context {
 7 
 8     private String input;
 9     private String output;
10 
11     public String getInput() {
12         return input;
13     }
14 
15     public void setInput(String input) {
16         this.input = input;
17     }
18 
19     public String getOutput() {
20         return output;
21     }
22 
23     public void setOutput(String output) {
24         this.output = output;
25     }
26 
27 }
 1 package com.cgj.pattern.interpreter;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 public class Test {
 7 
 8     public static void main(String[] args) {
 9         Context context = new Context();
10 
11         // 何時使用用哪個解釋器,應該由Context的內容決定,此處省略該過程
12         List<AbstractExpression> expressions = new ArrayList<AbstractExpression>();
13         expressions.add(new AExpression());
14         expressions.add(new BExpression());
15         expressions.add(new AExpression());
16         expressions.add(new BExpression());
17         expressions.add(new BExpression());
18         expressions.add(new AExpression());
19 
20         for (AbstractExpression expression : expressions) {
21             expression.interpret(context);
22         }
23     }
24 
25 }

(本隨筆參考了 程傑老師的<<大話設計模式>>)

解釋器模式-Interpreter