簡介
在某些情況下,為了更好地描述某一些特定型別的問題,我們可以創建一種新的語言,這種語言擁有自己的運算式和結構,即文法規則,
解釋器設計模式(Interpreter Design Pattern)描述了如何為簡單的語言定義一個文法,如何在該語言中表示一個句子,以及如何解釋這些句子,
因此,解釋器模式的定義是,為某個語言定義它的語法(文法)表示,并定義一個解釋器用來處理這個語法,
典型實作
首先,需要定義一個抽象運算式類,其宣告了抽象的解釋操作,其代碼示例如下:
public abstract class AbstractExpression {
public abstract void interpret(Context context);
}
終結符運算式是抽象運算式的子類,它實作了與文法中的終結符相關聯的解釋操作,在句子中的每一個終結符都是該類的一個實體,其代碼示例如下:
public class TerminalExpression extends AbstractExpression {
public void interpret(Context context) {
// 終結符運算式的解釋操作
}
}
非終結符運算式類相對比較復雜,由于在非終結符運算式中可以包含終結符運算式,也可以繼續包含非終結符運算式,因此其解釋操作一般通過遞回的方式來完成,其代碼示例如下:
public class NonTerminalExpression extends AbstractExpression {
private AbstractExpression left;
private AbstractExpression right;
public NonTerminalExpression(AbstractExpression left, AbstractExpression right) {
this.left = left;
this.right = right;
}
public void interpret(Context context) {
// 遞回呼叫每一個組成部分的 interpret() 方法
// 在遞回呼叫時指定組成部分的連接方式,即非終結符的功能
}
}
通常在解釋器模式中會提供一個環境類用于存盤一些全域資訊,如使用 HashMap 或者 ArrayList 等型別的集合物件,存盤一系列公共資訊,其代碼示例如下:
public class Context {
private HashMap<String, String> map = new HashMap<>();
public void assign(String key, String value) {
// 往環境中設值
map.put(key, value);
}
public String lookup(String key) {
// 獲取存盤在環境類中的值
return map.get(key);
}
}
總結
優點
解釋器模式的主要優點如下:
- 易于改變和擴展文法
- 每一條文法規則都可以表示為一個類,因此可以方便地實作一個簡單的語言
- 實作文法較為容易
- 增加新的解釋器運算式較為方便
缺點
解釋器模式的主要缺點如下:
- 對于復雜文法難以維護,增加文法規則會導致類急劇增加,導致系統難以管理和維護
- 解釋器模式使用了大量回圈和遞回呼叫,執行效率較低
適用場景
解釋器模式的適用場景如下:
- 可以將一個需要解釋執行的語言中的句子表示為一個抽象語法樹
- 一些重復出現的問題可以用一種簡單的語言來進行表達
- 一個語言的文法較為簡單
原始碼
在 JDK 中,java.text.Format 就是一個抽象運算式類的實作,如下是其部分原始碼:
public abstract class Format implements Serializable, Cloneable {
AttributedCharacterIterator createAttributedCharacterIterator(String s) {
AttributedString as = new AttributedString(s);
return as.getIterator();
}
AttributedCharacterIterator createAttributedCharacterIterator(
AttributedCharacterIterator[] iterators) {
AttributedString as = new AttributedString(iterators);
return as.getIterator();
}
}
首發于翔仔的個人博客,點擊查看更多,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/531566.html
標籤:設計模式
上一篇:生成分頁按鈕編號和點
下一篇:初識設計模式 - 解釋器模式
