寫文章的初心主要是用來幫助自己快速的回憶這個模式該怎么用,主要是下面的UML圖可以起到大作用,在你學習過一遍以后可能會遺忘,忘記了不要緊,只要看一眼UML圖就能想起來了。同時也請大家多多指教。
解釋器模式(Interpreter)
類行為型模式。
目錄
一、概述
1.1、直觀的理解:
1.2、主要角色:
1.3、描述對象之間關系的UML圖:
1.4、適用場景:
二、代碼舉例
2.1、對象之間的關系用UML圖描述如下:
2.2、Java代碼如下:
一、概述
1、給定一個語言,定義它的文法的一種表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。
1.1、直觀的理解:
假設有2個解釋器按順序解釋內容,那么:
可以看到內容被解釋器一段一段的解釋和翻譯。
1.2、主要角色:
- 解釋器:解釋器的抽象類或接口 + 具體的解釋器實現類 (包括:?終結符表達式 + 非終結符表達式)
- 內容(Context):被解釋的內容
- 請求發起者(Client)
1.3、描述對象之間關系的UML圖:
1.4、適用場景:
?1、如果一種特定類型的問題發送的頻率足夠高,那么可能就值得將該問題的各個實例表述為一個簡單語言中的句子。這樣就可以構建一個解釋器,該解釋器通過解釋這些句子來解決該問題;
2、可以更容易地改變和擴展文法,因為該模式使用類來表示文法規則,你可以使用繼承來改變或擴展該文法;
3、當有一個語言需要解釋執行,并且你可將該語言中的句子表示為一個抽象語法樹時,可使用解釋器模式;
4、典型的例子有:正則表達式;
5、因為解釋器模式為文法中的每一條規則至少定義了一個類,所以文法非常復雜時,還是建議使用其他技術如語法分析程序或編譯器生成器來處理。
(注:當效率不是關鍵問題時,才會用此模式,如正則表達式更多情況下是轉換為狀態機來實現的。狀態機是什么?我一時也說不出來什么,不過你可以在練習編程算法的網站上找相關的題去學習題解或練習。)
二、代碼舉例
假設現有兩個解釋器用來解釋字符串的內容。
這個例子比較簡單,就不再詳細分析了。但你可以把本例當做一個模板,然后靈活使用:
2.1、對象之間的關系用UML圖描述如下:
2.2、Java代碼如下:
內容類:
public class Context {private String input;public String getInput() {return input;}public void setInput(String input) {this.input = input;}private String output;public String getOutput() {return output;}public void setOutput(String output) {this.output = output;}
}
解釋器的抽象類:
abstract class AbstractExpression {public abstract void interpret(Context context);
}
解釋器A:
public class ConcreteExpressionA extends AbstractExpression {@Overridepublic void interpret(Context context) {System.out.println("解釋器A,處理中。。。。");}
}
解釋器B:
public class ConcreteExpressionB extends AbstractExpression {@Overridepublic void interpret(Context context) {System.out.println("解釋器B,處理中。。。。");}
}
主程序(發起請求的類):
public class Main {public static void main(String[] args) {Context context = new Context();//核心是解釋器如何處理內容,以下只是最簡單的舉例List<AbstractExpression> expressionList = new ArrayList<>();expressionList.add(new ConcreteExpressionA());expressionList.add(new ConcreteExpressionB());expressionList.add(new ConcreteExpressionA());expressionList.add(new ConcreteExpressionB());for (AbstractExpression abstractExpression : expressionList) {abstractExpression.interpret(context);}}
}
這里就不再舉例了,可以把上面的Java例子復制到你本地,運行main函數試一下加深理解。這些代碼都是我自己學習的時候根據一些教材手敲的,不存在bug可以直接運行。
如果覺得本文還不錯,就請點個贊給作者一點鼓勵吧!如果有建議,也請評論指教和討論!